Node.js 预保存和验证之间的mongoose差异?什么时候用哪个?
目前我正在使用Node.js 预保存和验证之间的mongoose差异?什么时候用哪个?,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,目前我正在使用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) d
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
}
}
exports.user={
用户名:函数(输入){
如果(!输入)
返回“用户名是必需的”
最小值=3
var最大值=10
如果(输入长度最大值)
返回“用户名最大长度为”+max
返回空
}
}
还有另一个api
validate
来做类似的事情。它们之间有什么区别?在什么情况下我应该使用哪一种 更新:
验证在用户定义的钩子之前执行。你可以跟随,在投稿人陈述的地方
没有实施这一点。首先验证给了我们一个停止的机会
在继续进入用户定义的钩子(可能包括异步钩子)之前
其他收藏的更新
如果我们需要在内部进行更改后再次运行验证
我们总是可以手动运行一个钩子this.validate(next)
过时: 是的,我知道有一点不同 预钩子在验证之前执行 github上有一个已解决的问题,要求在预挂接之前进行验证。
在@kamholz的同一链接中指出,在预挂钩之前没有进行验证也是有原因的: 假设您有两个字段,foo和fooSort,这两个字段都是必需的。fooSort是一个 要在中使用的foo的小写或其他转换版本 分类。因为fooSort可以自动生成,所以它是有意义的 在预保存挂钩中执行此操作。但由于验证首先运行,它将 在预保存挂钩运行之前失败,并有机会填写 fooSort值。这不是一个能够运行验证的问题 再次手动 同样,如果您想验证某些内容,然后需要用于后期验证的钩子:
UserSchema.post('validate', function(next){
console.log("post validate called");
next();
});
总之,我看到的一个区别是
上述答案不正确。如果您转到:并阅读mongoose撰稿人对该主题的回复,您将看到他注意到这些回复是故意运行的 主题名为:验证应在所有其他预保存挂钩之后运行 猫鼬的贡献者阿赫克曼说:
- 现在它在他们面前运行
- 没有实施这一点。首先验证使我们有机会在继续进入用户定义的钩子(可能包括对其他集合的异步更新)之前停止