OMG*_*POP 18 mongoose mongodb node.js express
目前我正在使用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()
})
Run Code Online (Sandbox Code Playgroud)
辅助模块有一个接受输入并返回错误消息的函数.
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
}
}
Run Code Online (Sandbox Code Playgroud)
还有另一个api validate
做类似的事情.它们之间有什么区别,我应该在哪些情况下使用哪一个?
Nae*_*ikh 11
更新:
验证在用户定义的挂钩之前执行.您可以关注此贡献者指出的github帖子,
没有实现这个.首先验证使我们有机会在继续进入用户定义的挂钩之前停止,这可能包括对其他集合的异步更新.
如果我们需要验证以便在从钩子内部进行更改后再次运行,我们总是可以手动运行
this.validate(next)
.
已过期:
是的,我知道有一点不同.
在验证之前执行预挂钩.
在github上有一个封闭的问题,要求在预挂钩之前进行验证,https://github.com/Automattic/mongoose/issues/400.
假设你有两个字段,foo和fooSort,两者都是必需的.fooSort是foo的小写或其他转换版本,用于排序.由于fooSort可以自动生成,因此在预保存挂钩中这样做是有意义的.但是,由于验证首先运行,它将在预保存挂钩运行之前失败并且有机会填写fooSort值.这不是能够再次手动运行验证的问题.
同样,如果你想验证一些东西,然后需要钩子进行后验证:
UserSchema.post('validate', function(next){
console.log("post validate called");
next();
});
Run Code Online (Sandbox Code Playgroud)
只要您获得输入以直接保存在db而不更改任何内容(仅验证),您就可以使用它们.
如果你要改变任何东西,你必须使用预保存挂钩.
上面的答案是不正确的。如果您访问:https : //github.com/Automattic/mongoose/issues/400并从猫鼬贡献者那里读取对该主题的回复,您会发现他注意到它们是故意运行的。
主题名为:验证应在所有其他预保存的钩子之后运行
猫鼬的贡献者aheckmann指出:
归档时间: |
|
查看次数: |
5617 次 |
最近记录: |