Sequelize-如果allowNull === false且值为空,则运行验证

时间:2019-01-29 20:53:49

标签: node.js sequelize.js

我正在编写一个应用程序,并将Sequelize用作ORM。我遇到了这个问题:我有一个模型,其中包含2个字段(为简单起见,它实际上更多),并且它们彼此依赖,如下所示:

const Application = sequelize.define('application', {
    visa_required: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
        defaultValue: false
    },
    visa_passport_number: {
        allowNull: false,
        type: Sequelize.STRING,
        defaultValue: '',
        validate: {
            shouldBeSetIfVisaRequired(val) {
                if (this.visa_required && (typeof val !== 'string' || val.trim().length === 0)) {
                    throw new Error('Please fill in this field.');
                }
            }
        }
    }
});

因此,如果设置了visa_required字段,则也应该设置visa_passport_number

问题是,当我将true传递给visa_required并将null传递给visa_passport_number时,它失败并出现application.visa_passport_number cannot be null错误。当我不传递此值时,它会确定(尽管会保存为空字符串)。

我可以将allowNull: true作为visa_passport_number的参数来传递,但是那样的话,如果我将此值设置为null,则该验证将被忽略。

那么,我该如何完成我想要达到的目标?

1 个答案:

答案 0 :(得分:1)

这些字段级别的验证会奇怪地处理null(IMHO)。您可能想要尝试这样的行级验证:

const Application = sequelize.define('application', {
visa_required: {
    type: Sequelize.BOOLEAN,
    allowNull: false,
    defaultValue: false
},
visa_passport_number: {
    allowNull: false,
    type: Sequelize.STRING,
    defaultValue: ''
    }
},
validate: {
    needPassportNumberIfVisaRequired() {
       if (this.visa_required && 
           (this.visa_passport_number === null
           || typeof this.visa_passport_number  !== 'string' 
           || this.visa_passport_number.trim().length === 0)) {
                throw new Error('Please fill in the passport number field.');
            }
        }
});