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

时间:2015-07-17 08:57:20

标签: 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)
        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做类似的事情。它们之间有什么区别,我应该在哪些情况下使用哪一个?

2 个答案:

答案 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();
});

<小时/> 总而言之,我看到的一个区别是,

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

  2. 如果您要更改任何内容,则必须使用预保存挂钩。

  3. <击>

答案 1 :(得分:5)

上述答案不正确。如果你去:https://github.com/Automattic/mongoose/issues/400并阅读mongoose撰稿人对该主题的回复,你会发现他注意到他们是故意的。

主题名称为:验证运行所有其他预保存挂钩

Mongoose撰稿人aheckmann表示:

  • 现在正在运行 他们
  • 没有实现这个。验证第一个让我们有机会在继续进入用户定义的挂钩之前停止,这可能包括对其他集合的异步更新。