我想为Mongoose创建一个验证器,如果该行已经存在,会导致.save()
失败。目前我的验证员看起来有点像这样(咖啡):
model.schema.path('email').validate (email) =>
return email? and email.length > 0
, 'BLANK_EMAIL'
但是,它们是同步的,因此检查内部长度@model.find
是行不通的。我正在考虑使用类似下面的伪代码,但我不知道它是否可行,或者是否有更简单的方法遵循相同的猫鼬验证模式我是已经在用谢谢!
model.schema.pre 'save', (next) ->
self = @
model.find {email: self.email}, (err, rows) ->
if rows.length
# This bit is the pseudo-code:
model.schema.path('email').validate false
next()
答案 0 :(得分:1)
http://mongoosejs.com/docs/api.html#schematype_SchemaType-validate
schema.path('email').validate(function (value, respond) {
mongoose.model("user").count({email: this.email}, function(err, num) {
respond(!(err || num)); // validation failed
})
}, '{PATH} failed validation.');
您可能需要检查email: this.email, _id: {$ne: this._id}
,具体取决于您的需求。上面的代码段是未经测试的,但您可以得到一般的想法。
具有两个参数(值和一个回调)的验证器以异步方式运行,而不是具有单个参数(值)的验证器,它必须返回一个布尔值。回调接收一个布尔值,表示应该抛出错误。 AFAIK,您无法将Error
实例传递给回调。