Mongoosevalidation只有当改变

我想validation一个用户的电子邮件地址,但只有当它被更改。 下面的代码似乎每次我为任何一个入口保存vlaidate,因此抛出一个错误,电子邮件是重复的,当它自我保存。

如何正确validation创build者的创build时间,而不是每次进行编辑和保存?

 EntrantSchema.pre 'save', (next)-> user = this # Email Validation if (user.isModified('email')) console.log "Email has been changed".green.inverse # Unique Value EntrantSchema.path("email").validate ((email,respond) -> Entrant.findOne {email:email}, (err,user) -> if user respond(false) respond(true) ), "Oopsies! That e-mail's already been registered" 

请注意,我认为validate()被绑定的第一次,因为当我更新一个用户,我不会得到“电子邮件已被更改”,我是console.logging在我的代码

你正在使用错误的方式进行validation。 Mongoose将validation程序附加到模式,而不是单个文档,这使得它们是全局的。

所以,而不是在pre 'save'validation电子邮件,你应该定义一个好的电子邮件validation器:

 EntrantSchema.path('email').validate ((email,respond) -> return respond true unless @isModified 'email' Entrant.count {email}, (err, count) -> respond count is 0 ), "Oopsies! That e-mail's already been registered" 

但是,如果你想让电子邮件是唯一的,那么最好使用unique索引:

 EntrantSchema = new mongoose.Schema email: type: String, unique: true 

在validation器中检查唯一值可以使用相同的电子邮件更新两个用户。

顺便说一下,钩子( pre ) 将在Mongoose 4.0被删除 。