预存和验证之间的猫鼬差异?什么时候使用哪一个?

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.


并且还有一个原因是在@kamholz在同一链接中指出之前没有进行验证之前的验证:

假设你有两个字段,foo和fooSort,两者都是必需的.fooSort是foo的小写或其他转换版本,用于排序.由于fooSort可以自动生成,因此在预保存挂钩中这样做是有意义的.但是,由于验证首先运行,它将在预保存挂钩运行之前失败并且有机会填写fooSort值.这不是能够再次手动运行验证的问题.

同样,如果你想验证一些东西,然后需要钩子进行后验证:

UserSchema.post('validate', function(next){
    console.log("post validate called");
    next();
});
Run Code Online (Sandbox Code Playgroud)


总而言之,我看到的一个区别是,

  1. 只要您获得输入以直接保存在db而不更改任何内容(仅验证),您就可以使用它们.

  2. 如果你要改变任何东西,你必须使用预保存挂钩.


Car*_*ate 6

上面的答案是不正确的。如果您访问:https : //github.com/Automattic/mongoose/issues/400并从猫鼬贡献者那里读取对该主题的回复,您会发现他注意到它们是故意运行的。

主题名为:验证应所有其他预保存的钩子之后运行

猫鼬的贡献者aheckmann指出:

  • 现在正在运行 他们面前
  • 没有实现这一点。首先进行验证使我们有机会停止操作,然后再进入用户定义的挂钩,其中可能包括对其他集合的异步更新。