我已经使用sequelize@3.4.1一段时间了,现在我需要将sequelize更新到最新的稳定版本(3.28.0)
TL; DR:如何更改验证错误的结构,而不是操纵' msg'模型定义中的属性?
问题是,我在所有模型中使用自定义验证消息,例如:
var Entity = sequelize.define("Entity", {
id: {
type: DataTypes.INTEGER.UNSIGNED,
allowNull: false,
primaryKey: true,
autoIncrement: true,
validate: {
isInt: {
msg: errorMessages.isInt()
}
}
},
name: {
type: DataTypes.STRING(128),
allowNull: false,
unique: {
name: "uniqueNamePerAccount",
args: [["Name", "Account ID"]],
msg: errorMessages.unique()
},
validate: {
notEmpty: {
msg: errorMessages.notEmpty()
}
}
},
accountId: {
type: DataTypes.INTEGER.UNSIGNED,
allowNull: false,
unique: {
name: "uniqueNamePerAccount",
args: [["Name", "Account ID"]],
msg: errorMessages.unique()
},
validate: {
isInt: {
msg: errorMessages.isInt()
}
}
}
}
直到sequelize@3.4.1我曾经将自己的属性添加到验证错误中,所以实际上消息是包含消息和其他属性(如内部错误代码)的对象。 以下是消息的示例:
function notEmpty() {
return {
innercode: innerErrorCodes.notEmpty,
data: {},
message: "cannot be empty"
};
}
function unique() {
return {
innercode: innerErrorCodes.unique,
data: {},
message: util.format("There is already an item that contains the exact same values of the following keys")
};
}
实际上,这就是实体过去的样子:
{"name":"SequelizeValidationError",
"message":"Validation error: cannot be empty",
"errors":[{"message":"cannot be empty",
"type":"Validation error",
"path":"name",
"value":{"innercode":704,
"data":{},
"message":"cannot be empty"},
"__raw":{"innercode":704,
"data":{},
"message":"cannot be empty"}}]}
所以基本上sequelize发现了我的消息''属性并将其附加到错误的值中。 但现在,在最新版本中,它看起来像sequelize抛出新的Error():( instance-validator.js行:268)
throw new Error(test.msg || 'Validation ' + validatorType + ' failed');
而不是3.4.1版本中引发的错误:
throw test.msg || 'Validation ' + validatorType + ' failed';
因此,我设置为自定义消息的错误对象显示为'对象对象' (最有可能在toString()之后)
我的问题是:如何影响错误的结构并添加除消息之外的更多属性?
P.S: 我也遇到了唯一约束自定义消息的问题,它有所不同,因为它不被视为验证器。 如何影响唯一约束错误结构?
非常感谢!