Mongoose 仅​​在数据存在时强制验证

Mongoose force validation only if data is present

我正在创建一个用户模型,它将创建不同的策略,如本地、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 逻辑移动到此数组中的第二个函数,然后对其他必填字段执行此操作。