【问题标题】:Mongoose force validation only if data is present仅在存在数据时才进行 Mongoose 强制验证
【发布时间】:2015-05-09 08:22:28
【问题描述】:

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

我会收到一个错误,因为本地对象验证失败。那么我怎样才能让它们不相互依赖并且在插入值时仍然验证数据呢?

【问题讨论】:

    标签: node.js mongodb validation mongoose


    【解决方案1】:

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

    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 逻辑移动到此数组中的第二个函数,然后对其他必填字段执行此操作。

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 2012-12-09
      • 2018-08-22
      • 2019-11-04
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      相关资源
      最近更新 更多