1

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

 
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。

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

4

1 回答 1

3

我弄清楚了问题所在:

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

因此,不要将真值检查为:


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

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

除此之外,与 Sequelize (尤其是如果您来自 Rails)相当违反直觉的是 save 不执行隐式验证。

于 2012-12-11T05:08:29.810 回答