查询验证错误被忽略

时间:2012-12-11 04:55:59

标签: mysql node.js sequelize.js

我的模型定义如下:

 
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

更进一步,我还可以推送任意随机字符,这些字符不应该由正则表达式constaints验证,验证器也很乐意接受它们。

所以,我决定检查验证器是否正在运行,并尝试使用自定义验证器进行检查:


  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方法确实执行了,但验证方法成功但没有抛出任何错误或返回false。

我做错了什么,以及如何纠正上述问题?

1 个答案:

答案 0 :(得分:3)

我弄清楚问题是什么:

validate方法不返回表示验证是否成功的布尔值。相反,它返回一个哈希数组,它将字段与抛出的错误数组匹配。

所以不要将真值视为:


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

我应该检查u.validate()返回的数组的长度。

除此之外,Sequelize(特别是如果你来自Rails)的反直觉是保存不执行隐式验证。