仅在存在数据时才进行Mongoose强制验证

时间:2015-03-07 22:14:41

标签: node.js mongodb validation mongoose

我正在创建一个用户模型,它将创建不同的策略,如本地,脸书,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);
});

我会收到错误,因为本地对象验证失败了。那么我怎样才能使它们不依赖于彼此,并在插入值时仍然验证数据?

1 个答案:

答案 0 :(得分:0)

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

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逻辑移动到此数组中的第二个函数,并将其执行到其他必需字段。