mongoose 5.7.0 中的自定义验证

Posted

技术标签:

【中文标题】mongoose 5.7.0 中的自定义验证【英文标题】:Custom validations in mongoose 5.7.0 【发布时间】:2020-01-19 07:32:05 【问题描述】:

以前我使用的是旧版本的 mongoose,即 4.3.7,并且自定义模式验证作为预保存挂钩运行良好。我所要做的就是将错误发送到回调函数。

现在升级到最新版本的猫鼬后,相同的验证功能不再起作用了。

我的架构如下所示:

var UserSchema = new Schema(
  email: 
    type: String,
    required: true,
    unique: true,
    validate: [validateUniqueEmail, 'E-mail address is already in-use'],
    lowercase: true
  

在 mongoose 4.3.7 中,验证函数如下所示:

var validateUniqueEmail = function(value, callback) 
  var User = mongoose.model('User');
    User.find(
        $and: [
            email: value
        , 
            _id: 
                $ne: this._id
            
        ]
    , function(err, user) 
        callback(err || user.length === 0);
    );
;

在上面的代码中,“回调”变量将是保存后回调,它会在 .save() 调用期间自动进入,一切正常。

但是当我升级到最新版本的 mongoose 时,validateUniqueEmail 内的 "callback" 变量的值为 null

我没有在网上找到任何有关如何为最新版本的 mongoose 执行此操作的相关示例。我尝试发送真/假,但这也不起作用。

任何帮助都会很棒!

【问题讨论】:

尝试使用承诺而不是回调 【参考方案1】:

隐式异步自定义验证器(带 2 个参数的自定义验证器)在 mongoose >= 4.9.0 中已弃用。而在docs中,还写着:

如果您更喜欢回调,请设置 isAsync 选项,mongoose 会将回调作为第二个参数传递给您的验证器函数。

所以在较新的版本中,您需要指定isAsync 选项才能使其工作。像这样的:

var UserSchema = new Schema(
  email: 
    type: String,
    required: true,
    unique: true,
    validate: 
      isAsync: true,
      validator: validateUniqueEmail, 
      message: 'E-mail address is already in-use'
    ,
    lowercase: true
  

在mongoose release notes阅读更多内容。

【讨论】:

以上是关于mongoose 5.7.0 中的自定义验证的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:简单的自定义验证功能不起作用

Mongoose Schema 类型作为 TypeScript 的自定义接口?

处理 Mongoose 验证错误——在哪里以及如何处理?

Mongoose 的自定义错误消息

模板中的自定义表单验证错误

Angular4 中的自定义验证