Node.js 保存数据前的mongoose验证它说完成不是一个函数?
我想检查电子邮件是否已经在数据库中,所以我使用了以下代码,它总是给我错误完成不是一个函数不知道为什么会发生这种情况,请帮助我摆脱这个问题:Node.js 保存数据前的mongoose验证它说完成不是一个函数?,node.js,mongoose,mongoose-schema,Node.js,Mongoose,Mongoose Schema,我想检查电子邮件是否已经在数据库中,所以我使用了以下代码,它总是给我错误完成不是一个函数不知道为什么会发生这种情况,请帮助我摆脱这个问题: userSchema.path('email_id').validate(function(value, done) { this.model('User').count({ email_id: value }, function(err, count) { if (err) { return done(err); }
userSchema.path('email_id').validate(function(value, done) {
this.model('User').count({ email_id: value }, function(err, count) {
if (err) {
return done(err);
}
// If `count` is greater than zero, 'invalidate'
done(!count);
});
}, 'Email already exists');
错误是:
TypeError:done不是一个函数
在C:\nodejs\school\u election\u system\Model\user.js:65:9
在C:\nodejs\school\u election\u system\node\u modules\mongoose\lib\model.js:3949:16如果您需要唯一验证,我建议使用 找到的解决方案:
userSchema.path('email_id').validate(function (value, respond) {
return mongoose.model('User').count({ email_id: value }).exec().then(function (count) {
return !count;
})
.catch(function (err) {
throw err;
});
}, 'Email already exists.');
你能举一个“最小”的完整清单作为例子吗。i、 e只是模式和模型定义,并尝试执行导致激发验证的操作。我不能复制这个,所以如果你能显示一个列表,它实际上复制了它,那么它值得一看。总之,简单地标记为
“unique”
就可以完成同样的工作,而且开销要小得多。@NeilLunn,请检查此回购所有代码都在那里,请帮助我…@AluanHaddad No.这不是重复的。this
关键字旨在以这种方式用于Mongoose验证触发器和其他模式附加方法。对于“作者”而言,“最小”示例的思想是仅提供“在您的问题内”复制所需的代码,而不是通过外部链接。也就是说,您实际上已经为字段定义了“两次”验证。您可以使用“内联定义”或“寄存器定义”函数。但不是“两者都有”。但同样,您只需要在这里使用“unique”,或者简单地使用“upserts”
。这两种方法中的任何一种都不需要像您尝试的那样进行额外的异步调用。这样效果更好。是的,我可以试试这个,但我想知道为什么上面的代码不起作用
userSchema.path('email_id').validate(function (value, respond) {
return mongoose.model('User').count({ email_id: value }).exec().then(function (count) {
return !count;
})
.catch(function (err) {
throw err;
});
}, 'Email already exists.');