javascript - Javascript Joi 替代数组或对象数组
问题描述
我对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
这并不完全有用,因为现在我必须检查数百个项目才能找到有问题的项目。
但考虑到这已关闭,这是一个不同的问题!
解决方案
您的架构没有任何问题。您在数组中遇到的错误是:
"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 })
推荐阅读
- python - Errno 2 没有这样的文件或目录:'/storage/test.txt'
- docker - Does Docker image supporting Nvidia gpu on a cpu machine
- google-apps-script - script to split a string google sheet
- ios - ionic2-calendar/calendar time difference
- rdf - 如何提取/获取本体中的所有术语(类/属性)
- assembly - 如何在文本模式程序集中换行
- raspberry-pi3 - raspberry pi 3 + windows 10 iot changing password makes device inacessible
- java - Reinitialize spring @Autowire bean
- c# - System.FormatException 错误并在尝试修复它时遇到问题
- javascript - 仅在解决循环内的多次提取后如何在 React 中设置状态