我对Joi
的替代方案感到困惑。我不知道如何针对待验证的商品调用替代方法。
function validateCourse(course) {
const objectSchema = {
id: Joi.number().required(),
name: Joi.string().min(3).required()
};
const arraySchema = Joi.array().items(Joi.object(objectSchema)).required();
return Joi.alternatives(objectSchema, arraySchema).validate(course);
}
这适用于对象,但不适用于对象数组。
[
{
"id": 10,
"name": "XY"
},
{
"id": 11,
"name": "JFK"
}
]
我不确定我的阵列模式是否有问题还是使用替代方法?
似乎正在运行!但是,与验证对象相比,Joi在验证数组时返回的无效消息是模糊的。
validating object : "name" length must be at least 3 characters long
validating array : "value" must be an object
这并不是完全有用的,因为现在我必须检查数百个项目才能找到错误的项目。
但这是一个不同的问题,请考虑将其关闭!
答案 0 :(得分:1)
您的架构没有错。您在使用数组时遇到的错误是:
"value" must be an object, "value" at position 0 fails because
[child "name" fails because ["name" length must be at least 3 characters long]]
正确,您的姓名密钥必须至少包含3个字符。
然后,按照您的要求,可以从错误描述中获取失败的对象,或者
您还可以使用any.error(err)
来跟踪那些对象。
例如,如果您想知道失败的数组索引,可以执行以下操作:
const arraySchema = Joi.array().items(Joi.object(objectSchema)).required().error((errors) => {
const indexes = errors.map((err) => err.path[0]);
return new Error(`Indexes with error: ${indexes}`)
})
对于此对象数组:
[
{
'id': 11,
'name': 'ABC'
},
{
'id': 22,
'name': 'ABC'
},
{
'id': 33,
'name': 'XY'
},
{
'id': 44,
'name': 'ABC'
},
{
'id': 55,
'name': 'XY'
},
]
错误将是:
Indexes with error: 2,4
您可以执行以下操作来访问错误消息:
validationResult.error.message
别忘了在验证中使用{ abortEarly: false }
:
Joi.alternatives(objectSchema, arraySchema).validate(course, { abortEarly: false })
答案 1 :(得分:0)
按照数组描述的方式工作,但是对于非数组则什么也不显示,所以我做了一个小小的改变:
FaultExceptions
因此,如果它是一个数组,我将返回错误索引的数组(如您建议的那样)。但是,如果它是一个对象,我将原样返回{错误}。