目前我使用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可以做类似的事情.它们之间有什么区别?在什么情况下我应该使用哪一种?

推荐答案

Update:

验证在用户定义的钩子之前执行.你可以跟随this github post,投稿人说,

不执行这个.首先验证给了我们一个停止的机会

如果我们需要在内部进行更改后再次运行验证


Outdated:

是的,我知道有一点不同.

预钩子在验证之前执行.

github上有一个已解决的问题,要求在https://github.com/Automattic/mongoose/issues/400之前进行验证.


And also there is a reason for not having validation before pre hooks, stated in the same link by @kamholz:

假设您有两个字段,foo和fooSort,这两个字段都是必需的.fooSort是一个

同样,如果您想验证某个内容,然后需要用于后期验证的钩子:

UserSchema.post('validate', function(next){
    console.log("post validate called");
    next();
});


So for summary, the one difference i see is,

  1. 您可以使用这两种方法,只要您获得的输入可以直接保存在db中,而无需更改任何内容(仅限于验证).

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

Mongodb相关问答推荐

MongoDB:子文档中仅存在于父文档中的返回字段?

如何通过 Go 以 UUID 类型保存 Mongo 中的内容?

数组过滤器 MongoDB

如何对 MongoDB setWindowFields 中当前文档以外的文档进行操作

如何使用 MindsDB 和 MQL(对于我的 MongoDB 实例)实施零样本分类?

@DynamicPropertySource 未被调用(Kotlin、Spring Boot 和 TestContainers)

通过insertId MongoDB获取文档

MongoDB查询仅返回嵌入文档

如何将记录从一个 mongo 数据库插入另一个?

解析命令行时出错:unrecognized option --rest

Mongoose 架构引用和未定义类型ObjectID

什么 Javascript 库可以针对对象判断类似 MongoDB 的查询谓词?

在 MongoDB 中按条件分组

Golang + MongoDB 嵌入类型(将一个 struct 嵌入到另一个 struct 中)

如何根据其他字段添加条件模式?

初创公司应该考虑哪些数据库系统?

从 nodejs 到 mongodb 或 mongoose 的动态数据库连接

如何在 golang 和 mongodb 中通过 id 查找

带有 either or查询的mongoose findOne

何时使用Singleton单例、Transient和使用 Ninject 和 MongoDB 的请求