我需要创建动态模式来验证我的API请求查询,使用Joi validator,根据请求查询中的键。假设下面提到的模式是我的有效查询。
我使用的是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处理两种情况。
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个条件?
7条答案
按热度按时间ckx4rj1h1#
我以一种稍微不同的方式实现了同样的目标。在这里发布同样的内容,因为这可能对将来的人有用。
这正如预期的那样完美地工作。
当类型值为
1
时,对象应该只有type
、firstname
和lastname
当类型值为
2
时,对象应该只有type
、salary
和pension
当类型值为
3
时,对象应该只有type
、credit
和debit
任何其他的组合都将作为错误从joi验证器中间件层抛出。同样,除了1、2和3之外的任何其他类型值都将抛出错误。
btqmn9zl2#
对我有用!
这是参考。
mv1qrgav3#
在文档中看起来
switch
是与alternatives.conditional
一起使用的有效密钥。您可以尝试以下操作吗?找不到任何关于使用
switch
关键字的示例...但是在hapijs/joi github中找到了一些其他的方法来实现它
41ik7eoe4#
我在试着找一种方法来做类似的事情。然后我就能想通了。
izj3ouym5#
我也想做同样的事情,但是条件应该依赖于请求方法,而不是查询参数。
Joi when()条件文档https://joi.dev/api/?v=17.4.1#anywhencondition-options
fdx2calv6#
使用条件/开关,其语法也更具可读性。
下面的Joi摘录将在
$.type === Type.REFERENCE
时强制$.referenceClass
的存在。当它这样做时,它将确保值是可接受的值-...classIds
。否则(
$.type !== Type.REFERENCE
),它将不允许$.referenceClass
的存在(除非您运行验证时选择允许额外的密钥)。pepwfjgg7#
我认为这个解决方案是可读的,也反映了歧视工会非常好。