Joi 数组验证,强制至少一个项目基于另一个字段值
Joi Array validation , force at least one item based on another field value
我有以下验证块
// POST /api/resources
createResource: {
body: {
.... require at least 1 item
permissions: Joi.array().items(Joi.object().keys({
level: Joi.string(),
level_id: Joi.string().hex(),
canWrite: Joi.boolean()
})),
private: Joi.boolean().required()
}
},
当私有标志为 false 时,我希望至少需要 1 项权限
根据之前的问题(使用 includes() 而不是 items() ),我应该使用类似的东西:
permissions: Joi.array().items(Joi.object().keys({
level: Joi.string(),
level_id: Joi.string().hex(),
canWrite: Joi.boolean()
})).when('private'{is:false,then:Joi.required()})
但这不起作用
无论如何要验证它?
感谢反馈
您的验证格式有点奇怪,所以我假设您要验证整个请求对象。例如
{
createResource: {
body: {
permissions: [{...}, {...}],
private: false
}
}
}
但如果我假设错了,你仍然可以找出工作位..
我不建议将 POJO 与 Joi
对象混合使用。您的示例的问题是 Joi
不知道 permissions
和 private
键与同一对象相关。要解决此问题,您需要像这样为 entire 请求对象编写一个架构。
Joi.object().keys({
createResource: Joi.object().keys({
body: Joi.object().keys({
permissions: Joi.array().items(
Joi.object().keys({
level: Joi.string(),
level_id: Joi.string().hex(),
canWrite: Joi.boolean()
})).when('private', {is: false, then: Joi.required()}),
private: Joi.boolean().required()
})
})
});
所以这将在 private
为 true
时验证 true
(不需要权限)
...false
当 private
是 false
并且没有权限时
..and true
when private
is false
and permissions
is populated correctly.
我有以下验证块
// POST /api/resources
createResource: {
body: {
.... require at least 1 item
permissions: Joi.array().items(Joi.object().keys({
level: Joi.string(),
level_id: Joi.string().hex(),
canWrite: Joi.boolean()
})),
private: Joi.boolean().required()
}
},
当私有标志为 false 时,我希望至少需要 1 项权限 根据之前的问题(使用 includes() 而不是 items() ),我应该使用类似的东西:
permissions: Joi.array().items(Joi.object().keys({
level: Joi.string(),
level_id: Joi.string().hex(),
canWrite: Joi.boolean()
})).when('private'{is:false,then:Joi.required()})
但这不起作用 无论如何要验证它? 感谢反馈
您的验证格式有点奇怪,所以我假设您要验证整个请求对象。例如
{
createResource: {
body: {
permissions: [{...}, {...}],
private: false
}
}
}
但如果我假设错了,你仍然可以找出工作位..
我不建议将 POJO 与 Joi
对象混合使用。您的示例的问题是 Joi
不知道 permissions
和 private
键与同一对象相关。要解决此问题,您需要像这样为 entire 请求对象编写一个架构。
Joi.object().keys({
createResource: Joi.object().keys({
body: Joi.object().keys({
permissions: Joi.array().items(
Joi.object().keys({
level: Joi.string(),
level_id: Joi.string().hex(),
canWrite: Joi.boolean()
})).when('private', {is: false, then: Joi.required()}),
private: Joi.boolean().required()
})
})
});
所以这将在 private
为 true
时验证 true
(不需要权限)
...false
当 private
是 false
并且没有权限时
..and true
when private
is false
and permissions
is populated correctly.