如何使用 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;
        }
    }
}