我使用Node.js + PostgreSQL + Sequelize.js 2.0.2。我对phone字段有以下架构定义,它可以是字符串数组,但只允许数字:
var User = sequelize.define("User", {
....
....
/** Phone number
* Multiple numbers should be registered due to
*/
phone: {
type: Sequelize.ARRAY(Sequelize.STRING),
allowNull: false,
unique: true,
validate: {
isNumeric: true
}
},
....
....
});
未传递数字电话号码数组以进行验证。
输入:[ '9252522525', '9252525555' ]
错误:
{ [SequelizeValidationError: Validation error]
name: 'SequelizeValidationError',
message: 'Validation error',
errors:
[ { message: 'Validation isNumeric failed',
type: 'Validation error',
path: 'phone',
value: 'Validation isNumeric failed',
__raw: 'Validation isNumeric failed' } ] }
但是,单值数组输入[ '9252522525' ]
成功。是Sequelize的错误还是我错了?
我将验证器更改为is
,但没有成功。
validate: {
is: ["^[0-9]+$", "i"]
}
我收到了以下错误。
{ [SequelizeValidationError: Validation error]
name: 'SequelizeValidationError',
message: 'Validation error',
errors:
[ { message: 'Validation is failed',
type: 'Validation error',
path: 'phone',
value: 'Validation is failed',
__raw: 'Validation is failed' } ] }
答案 0 :(得分:2)
根据the Sequelize github repo issue,所有验证器都适用于数组,而不是作为最终用户似乎不清楚的数组中的单个项目。解决方法是定义自定义验证器:
phone: {
type: Sequelize.ARRAY(Sequelize.STRING),
allowNull: false,
unique: true,
validate: {
isValidPhoneNo: function(value) {
if (!value) return value;
var regexp = /^[0-9]+$/;
var values = (Array.isArray(value)) ? value : [value];
values.forEach(function(val) {
if (!regexp.test(val)) {
throw new Error("Number only is allowed.");
}
});
return value;
}
}
}
答案 1 :(得分:0)
我认为因为phone
的类型是ARRAY
,而不是STRING
我认为isNumeric
无法申请phone
。