我有一个定义如下的模型:
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就成功了。
我做错了什么,上面的问题该怎么纠正?
最佳答案
我发现了问题所在:
validate方法不返回指示验证是否成功的布尔值。相反,它返回一个哈希数组,将字段匹配为抛出的错误数组。
因此,与其把真理价值当作:
if (u.validate()) {
console.log("Validation succeeded");
} else {
console.log("Validation failed");
console.log(u.errors);
.............
}
我应该检查u.validate()返回的数组的长度。
除此之外,sequenceize(特别是如果您来自Rails)的反直觉之处在于save不执行隐式验证。