validation错误被忽略

我有一个模型定义如下:

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); ............. } 

尽pipe长度限制没有得到满足,validation器很高兴成功,我看到Validation succeeded在我的控制台。

更进一步,我还可以推入任意的随机字符,这些字符不应该被正则expression式constaintsvalidation,validation者也很乐意接受它们。

所以,我决定检查validation器是否在运行,并试图使用自定义validation器来检查:

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

我做错了什么?上述问题应该如何解决?

我找出问题所在:

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

所以不是检查真值,

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

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

除此之外,Sequelize(尤其是如果你是来自Rails)的反直觉是保存不会执行隐式validation。