Node.js 仅当数据存在时才进行Mongoose强制验证

Node.js 仅当数据存在时才进行Mongoose强制验证,node.js,mongodb,validation,mongoose,Node.js,Mongodb,Validation,Mongoose,我正在创建一个用户模型,它将创建不同的策略,如本地、facebook、gmail。。。我希望每个对象都做自己的验证,但是如果我没有在本地输入值,我不想验证这个字段并得到一个错误 例如: var UserSchema = new Schema({ local: { email : { type : String, required: true, validate: emailValidator, index : {

我正在创建一个用户模型,它将创建不同的策略,如本地、facebook、gmail。。。我希望每个对象都做自己的验证,但是如果我没有在本地输入值,我不想验证这个字段并得到一个错误

例如:

var UserSchema = new Schema({
  local: {
    email    : {
      type    : String,
      required: true,
      validate: emailValidator,
      index   : {
        unique: true
      }
    },
    firstName: {
      type    : String,
      validate: nameValidator,
      required: true
    },
    password : {
      type    : String,
      validate: passwordValidator,
      required: true
    }
  },
  facebook: {
    id   : String,
    email: String,
    name : String
  }
});
现在,当我想像这样保存来自facebook的用户时:

var newUser = new User();
newUser.facebook.id    = profile.id;
newUser.facebook.name  = profile.name.givenName;  
newUser.facebook.email = profile.emails[0].value;

newUser.save(function( err, user ) {
  if( err ) console.log(err);

  done(null, user);
});

我将收到一个错误,因为本地对象验证失败。因此,我如何使它们不相互依赖,并在插入值时仍然验证数据?

您必须创建一个自定义验证程序,并检查是否设置了正确的策略:

var emailValidator = [
    {
        validator: function(value) {
            if(!this.local) return true;
            return value;
        },
        msg: 'Email is required.'
    },
    {
        validator: function(value) {
            /* your current validation */
        },
        msg: 'Your error message...'
    }
];
只需将当前emailValidator逻辑移动到此数组中的第二个函数,并将其移动到其他必填字段