我有一个定义如下的模型:


var userTableConfig = {
    username: {
      type: Sequelize.STRING,
      allowNull: false,
      unique: true,
      validate: {
        len: [5, 30],
        is: ['[a-z0-9_]', 'i']
      }
    },
    email: {
      type: Sequelize.STRING,
      allowNull: false,
      unique: true,
      validate: {
        isEmail: true,
        len: [5, 30]
      }
    },
    ............. // Other fields
}

var userConfig =  userConfig = {
    underscored: true,
    instanceMethods: {
        ..............
    }
}

var User = seq.define('User', userTableConfig, userConfig);


现在,当我按如下方式使用此模型时:

    u = User.build();
    u.username = this.param('username');    // Contains empty string
    u.setPassword(this.param('password'));  // Contains empty string
    u.email = this.param('email');
    u.activation_state = 'pending';

    if (u.validate()) {
      console.log("Validation succeeded");
    } else {
      console.log("Validation failed");
      console.log(u.errors);
      .............
    }


尽管没有满足长度限制,验证器还是很高兴地成功了,我在控制台中看到了Validation succeeded
更进一步,我还可以输入任意的随机字符,这些字符不应该被正则表达式常量验证,验证器也很乐意接受它们。
因此,我决定检查验证程序是否正在运行,并尝试使用自定义验证程序检查:

  userTableConfig = {
    username: {
      type: Sequelize.STRING,
      allowNull: false,
      unique: true,
      validate: {
        randomValidator: function() {
          console.log("===========> validator executed");
          throw new Error('Hell with validation');
          return false;
        },
        len: [5, 30],
        is: ['[a-z0-9_]', 'i']
      }
    },
    ......
  }

具有讽刺意味的是,方法randomValidator确实执行了,但是validate方法没有抛出任何错误或返回false就成功了。
我做错了什么,上面的问题该怎么纠正?

最佳答案

我发现了问题所在:
validate方法不返回指示验证是否成功的布尔值。相反,它返回一个哈希数组,将字段匹配为抛出的错误数组。
因此,与其把真理价值当作:


if (u.validate()) {
      console.log("Validation succeeded");
    } else {
      console.log("Validation failed");
      console.log(u.errors);
      .............
    }

我应该检查u.validate()返回的数组的长度。
除此之外,sequenceize(特别是如果您来自Rails)的反直觉之处在于save不执行隐式验证。

10-04 21:45
查看更多