【发布时间】:2020-05-08 17:14:33
【问题描述】:
我需要根据请求查询中的键使用Joi validator 创建动态模式来验证我在node js 中的api 请求查询。假设下面提到的模式是我的有效查询。
我正在使用hapi/joi 版本16.1.8
组合1
{ type: 1, firstname: 'user first name', lastname: 'user last name'}
组合2
{ type: 2 , salary: 1000, pension: 200}
组合3
{ type: 3 , credit: 550, debit: 100}
如您所见,对象键因type 的值而异。如何妥善处理?
我们可以使用Joi.alternatives like 处理两种情况
const schema = Joi.alternatives().conditional(Joi.object({ type: 1 }).unknown(), {
then: Joi.object({
type: Joi.string(),
firstname: Joi.string(),
lastname: Joi.string()
}),
otherwise: Joi.object({
type: Joi.number(),
salary: Joi.any(),
pension: Joi.any()
})
});
但是如何在 3 个条件下做到这一点呢?
【问题讨论】:
-
我会编写路由前中间件,它将有条件地定义要使用的模式。但是对于您的问题,Grégory NEUT 的答案是最合适的。
-
@num8er 我尝试了文档中的解决方案,它也是正确的。但是当我尝试添加相同的错误时,我抛出了一个错误。我已经更新了另一个工作示例作为答案。
-
如何根据数据类型应用验证,例如数据类型是否为数组,然后检查数组中的每个项目,否则如果它是字符串,则验证必须是其他内容。例如。数据 = [1,2,3] 或数据 = '1'。这里如果数据是数组,则检查每个元素是否为数字,否则只需检查数据是否为数字
-
@user2459780 你可以用
Joi.alternatives()实现这个目标
标签: javascript node.js hapijs joi