如何使用 Sequelize.js 和 PostgreSQL 验证数组字段的数组输入?
How to validate array input for array field using Sequelize.js and PostgreSQL?
我正在使用 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
}
},
....
....
});
数字数组 phone 未通过验证。
输入: [ '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的bug还是我哪里错了?
[编辑]
我将验证器更改为 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' } ] }
我认为是因为 phone
的类型是 ARRAY
,而不是 STRING
。
isNumeric
不能申请 phone
,我想。
根据 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;
}
}
}
我正在使用 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
}
},
....
....
});
数字数组 phone 未通过验证。
输入: [ '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的bug还是我哪里错了?
[编辑]
我将验证器更改为 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' } ] }
我认为是因为 phone
的类型是 ARRAY
,而不是 STRING
。
isNumeric
不能申请 phone
,我想。
根据 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;
}
}
}