我正在编写一个应用程序,并将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,则该验证将被忽略。
那么,我该如何完成我想要达到的目标?
答案 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.');
}
}
});