【问题标题】:Sequelize validation errors being ignoredSequelize 验证错误被忽略
【发布时间】:2012-12-29 14:08:07
【问题描述】:

我有一个模型定义如下:

 
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。

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

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    我发现了问题所在:

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

    所以不要将真值检查为:

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

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

    除此之外,与 Sequelize(尤其是如果您来自 Rails)完全相反的是,保存不执行隐式验证。

    【讨论】:

    • 保存前的隐式验证将成为 1.6.0 的一部分。
    • @sdepold 很高兴知道。拥有这将是一件好事。
    • 我实际上在 1.7 中对此进行了修复 :)
    • 此答案不适用于当前版本3.2.3validate() 现在返回了一个承诺,但我遇到了同样的问题,验证从未运行,我的 reject 回调从未运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2012-09-18
    • 1970-01-01
    • 2018-05-08
    • 2012-11-24
    • 2014-03-11
    • 1970-01-01
    相关资源
    最近更新 更多