Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 预保存和验证之间的mongoose差异?什么时候用哪个?_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

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

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

  • 您可以使用这两种方法,只要将输入直接保存在db中,而不改变任何内容(仅验证)

  • 如果要更改任何内容,必须使用预保存挂钩


  • 上述答案不正确。如果您转到:并阅读mongoose撰稿人对该主题的回复,您将看到他注意到这些回复是故意运行的

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

    猫鼬的贡献者阿赫克曼说:

    • 现在它在他们面前运行
    • 没有实施这一点。首先验证使我们有机会在继续进入用户定义的钩子(可能包括对其他集合的异步更新)之前停止

    请编辑您的答案,因为它具有误导性。最后一个问题是,验证器应该在预钩子之前运行,就像现在的情况一样。那么,两者之间有什么区别呢?嘿,我知道这是一个很老的回答,但是使用预保存和预验证钩子有什么区别?据我所知,它们都做相同的事情?它们非常相似,基本上提供相同的功能,但在不同的组和顺序中。它允许您对有效性和保存有单独的要求。就像某人只能有5个vs缺少的字段一样。如果您需要在数据有效后操作数据,那么预保存也是很好的