Node.js mongoose 5.7.0中的自定义验证

Node.js mongoose 5.7.0中的自定义验证,node.js,mongodb,validation,mongoose,mongoose-schema,Node.js,Mongodb,Validation,Mongoose,Mongoose Schema,以前我使用的是mongoose的旧版本,即4.3.7,而作为预保存挂钩的自定义模式验证工作得很好。我所需要做的就是将错误发送到回调函数 现在升级到最新版本的mongoose后,相同的验证功能不再工作 我的模式如下所示: var UserSchema = new Schema({ email: { type: String, required: true, unique: true, validate: [validateUniqueEmail, 'E-mail

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

现在升级到最新版本的mongoose后,相同的验证功能不再工作

我的模式如下所示:

var UserSchema = new Schema({
  email: {
    type: String,
    required: true,
    unique: true,
    validate: [validateUniqueEmail, 'E-mail address is already in-use'],
    lowercase: true
  }
}
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);
    });
};
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
  }
}
在mongoose4.3.7中,验证函数如下所示:

var UserSchema = new Schema({
  email: {
    type: String,
    required: true,
    unique: true,
    validate: [validateUniqueEmail, 'E-mail address is already in-use'],
    lowercase: true
  }
}
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);
    });
};
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
  }
}
在上面的代码中,“callback”变量将是post save callback,它在调用.save()时自动进入,一切正常

但是当我升级到最新版本的mongoose时,ValidateUniqueMailcallback“变量的值是null

我还没有在网上找到任何关于如何为最新版本的猫鼬做到这一点的相关例子。我试图发送真/假,但这也不起作用


任何帮助都会很好

在mongoose>=4.9.0中,不推荐使用隐式异步自定义验证器(接受2个参数的自定义验证器)。此外,它还说:

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

因此,在较新的版本中,您需要指定
isAsync
选项使其工作。大概是这样的:

var UserSchema = new Schema({
  email: {
    type: String,
    required: true,
    unique: true,
    validate: [validateUniqueEmail, 'E-mail address is already in-use'],
    lowercase: true
  }
}
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);
    });
};
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
  }
}

阅读更多信息。

尝试使用承诺而不是回调