如何使用Sequelize.js和PostgreSQL验证数组字段的数组输入?

时间:2015-02-23 08:21:28

标签: arrays node.js postgresql validation sequelize.js

我使用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' } ] }

2 个答案:

答案 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