目前我正在使用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
}
}
还有另一个apivalidate
做类似的事情。它们之间有什么区别,在什么情况下我应该使用哪一种?
Update:
验证在用户定义的挂钩之前执行。您可以关注这个 github 帖子 https://github.com/Automattic/mongoose/issues/400,贡献者指出,
不执行此操作。首先验证让我们有机会停下来
在继续进入可能包括异步的用户定义的挂钩之前
其他集合的更新。
如果我们在内部进行更改后需要再次运行验证
我们总是可以手动运行的钩子this.validate(next)
.
过时的:罢工>
是的,我知道有一点小小的区别。
预挂钩在验证之前执行。
github 上有一个已关闭的问题,要求在 pre hooks 之前进行验证,https://github.com/Automattic/mongoose/issues/400 https://github.com/Automattic/mongoose/issues/400.
And also there is a reason for not having validation before pre hooks, stated in the same link by @kamholz:
假设您有两个字段,foo 和 fooSort,两者都是必需的。 fooSort 是一个
要使用的 foo 的小写或其他转换版本
排序。既然 fooSort 可以自动生成,那就有意义了
在预保存挂钩中执行此操作。但由于验证首先运行,所以它会
在预保存挂钩运行之前失败并有机会填写
fooSort 值。这不是能否运行验证的问题
再次手动。
同样,如果您想验证某些内容,然后需要进行后验证的钩子:
UserSchema.post('validate', function(next){
console.log("post validate called");
next();
});
So for summary, the one difference i see is,
只要您将输入直接保存在数据库中而不改变任何内容(仅验证),您就可以使用两者。
如果您要更改任何内容,则必须使用预保存挂钩。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)