我的模型定义如下:
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。
我做错了什么,以及如何纠正上述问题?
答案 0 :(得分:3)
我弄清楚问题是什么:
validate方法不返回表示验证是否成功的布尔值。相反,它返回一个哈希数组,它将字段与抛出的错误数组匹配。
所以不要将真值视为:
if (u.validate()) {
console.log("Validation succeeded");
} else {
console.log("Validation failed");
console.log(u.errors);
.............
}
我应该检查u.validate()返回的数组的长度。
除此之外,Sequelize(特别是如果你来自Rails)的反直觉是保存不执行隐式验证。