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
被删除 。