我正在尝试使用Joi.alternatives.try()创建 Joi 模式。这是我尝试过的模式。
Joi.alternatives().try(Joi.object({
type: Joi.number().required().label('Error1!!')
}), Joi.object({
reason: Joi.string().required().label('Error2!!')
})).label('Error!!')
这是我使用过的对象。
{ reason: 2 }
我原本期望的错误信息是包含字符串Error2!!
的Error2!!
或其他错误信息。但实际上我收到的错误信息是:
验证错误:"Error !!"不匹配任何允许的类型。
该错误消息来自父节点。
如何使该错误信息更具体地指向该对象?例如,从替代对象节点而不是父对象节点返回的错误。
您可以使用这个平台在线验证模式。
更新: 下面是我使用的样例模式。
employee_retired = Joi.object({
type: Joi.number().required().valid(2, 3, 7),
reason: Joi.string().required()
.min(1)
.max(100),
firstname: Joi.string()
.required(),
lastname: Joi.string()
.required()
.min(1)
.max(255),
personaldetails: Joi.alternatives().conditional('type', {
is: 2, then: Joi.array().items(Joi.object({
address: Joi.string().required()
.min(1)
.max(100),
salary: Joi.string().required()
.min(0)
.max(500),
contactnumbers: Joi.array().items(Joi.object({
mobile: Joi.string().required()
.min(0)
.max(15),
home: Joi.string()
.required()
.min(1)
.max(15),
})).max(50).required(),
}).required()).max(50).required(),
otherwise: Joi.forbidden(),
}),
monthlysavings: Joi.alternatives().conditional('type', {
is: 3,
then: Joi.number()
.required()
.min(0)
.max(50000),
otherwise: Joi.forbidden(),
}),
isapproved: Joi.boolean().required(),
});
empolyee_working = Joi.object({
type: Joi.number().required().valid(2, 3, 7),
reason: Joi.string().required()
.min(1)
.max(100),
firstname: Joi.string()
.required(),
lastname: Joi.string()
.required()
.min(1)
.max(255),
contactnumbers: Joi.array().items(Joi.object({
mobile: Joi.string().required()
.min(0)
.max(15),
home: Joi.string()
.required()
.min(1)
.max(15),
})).max(50).required(),
monthlysavings: Joi.alternatives().conditional('type', {
is: 3,
then: Joi.number().required()
.min(1)
.max(50000),
otherwise: Joi.forbidden(),
}),
isapproved: Joi.boolean().required(),
})
const employee = Joi.alternatives().try(employee_retired, empolyee_working);