猫鼬5.7.0中的自定义验证

时间:2019-09-18 10:55:40

标签: node.js mongodb validation mongoose mongoose-schema

以前,我使用的是旧版本的猫鼬,即 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
  }
}

在猫鼬 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()调用期间自动出现,并且一切正常。

但是当我升级到最新版本的猫鼬时, validateUniqueEmail 中的“回调” 变量的值为 null

我没有在网络上找到有关如何对最新版本的猫鼬执行此操作的任何相关示例。我曾尝试发送true / false,但这也无法正常工作。

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

隐式异步自定义验证器(带有2个参数的自定义验证器)在mongoose> = 4.9.0中被弃用。并且在docs中,它还说:

  

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

因此,在较新的版本中,您需要指定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中了解更多信息。