目前我正在使用pre('save')
进行验证:
UserSchema.pre('save', true, function(next, done) {
var self = this //in case inside a callback
var msg = helper.validation.user.username(self.username)
if (msg) {
self.invalidate('username', msg)
done(helper.getValidationError(msg))
}
else
done()
next()
})
辅助模块有一个接受输入并返回错误消息的函数。
exports.user = {
username: function(input) {
if (!input)
return 'username is required'
var min = 3
var max = 10
if (input.length < min)
return 'username min of length is ' + min
if (input.length > max)
return 'username max of length is ' + max
return null
}
}
还有另一个api validate
做类似的事情。它们之间有什么区别,我应该在哪些情况下使用哪一个?
答案 0 :(得分:10)
更新:
验证在用户定义的挂钩之前执行。您可以关注贡献者所在的this github post,
没有实现这一点。首先验证让我们有机会停下来 在继续进入可能包含异步的用户定义的挂钩之前 其他馆藏的更新。
如果我们在从内部进行更改后需要再次运行验证 我们总是可以手动运行
this.validate(next)
。
<击> 的过时:强> 撞击>
<击>是的,我知道有一点不同。
在验证之前执行预挂钩。
github上有一个封闭的问题,要求在预挂钩https://github.com/Automattic/mongoose/issues/400之前进行验证。
<小时/> 并且还有一个原因是在预挂钩之前没有进行验证,@ kamholz在同一链接中说明:
假设您有两个字段,foo和fooSort,两者都是必需的。 fooSort是一个 用于的小写或其他转换版本的foo 排序。由于fooSort可以自动生成,因此有意义 在预先保存的钩子中这样做。但是,由于验证首先运行,它会 在预保存挂钩运行之前失败并且有机会填写 fooSort值。这不是能够运行验证的问题 再次手动。
同样,如果你想验证一些东西然后需要钩子来进行后验证:
UserSchema.post('validate', function(next){
console.log("post validate called");
next();
});
<小时/> 总而言之,我看到的一个区别是,
只要您获得输入以直接保存在db而不更改任何内容(仅验证),您就可以使用它们。
如果您要更改任何内容,则必须使用预保存挂钩。
<击> 撞击>
答案 1 :(得分:5)
上述答案不正确。如果你去:https://github.com/Automattic/mongoose/issues/400并阅读mongoose撰稿人对该主题的回复,你会发现他注意到他们是故意的。
主题名称为:验证运行所有其他预保存挂钩
Mongoose撰稿人aheckmann表示: