我想对Joi进行身体验证,但似乎永远无法正常工作,并且始终处于同一状态。
因此,如果我与此发布
终点:/ elasticSearch?eType = scroll&scroll = 1h
身体:{}
因为eType是scroll并且在这种情况下需要scroll_id,所以应该抛出错误,而不是null,不为空。
即使我发布与此
终点:/ elasticSearch?eType = search&scroll = 1h
身体:{}
会引发错误,因为eType是搜索,在这种情况下,需要查询。
因此,有了这些代码,
在一种情况下,它总是总是像没有验证一样通过,即使我认为他们不应该通过也是如此。在第二种情况下,我得到了错误:需要查询,并且在我打电话时始终需要scroll_id。
所以有人可以帮助我了解为什么这些验证是错误的?
谢谢
更新资料
默认情况下,如果我这样做:
body:
{
query:
Joi.alternatives()
.when(Joi.ref('$query.eType'),
{
is: Joi.string().equal('search'),
then: Joi.required()
}
),
scroll_id:
Joi.alternatives()
.when(Joi.ref('$query.eType'),
{
is: Joi.string().equal('scroll'),
then: Joi.required()
}
)
}
始终需要查询和scroll_id。
最佳答案
直接从文档复制。
使用Joi验证对象时,其他输入的值
(即标头,查询,参数,有效负载和身份验证)可用
在验证上下文中(可在规则中访问为
Joi.ref('$ query.key'))。
因此,请在您的eType引用中使用Joi.ref('$query.eType')
,因为您试图根据查询参数来验证有效负载,因此在验证阶段,它们位于单独的范围内。
Joi.alternatives()
.when(Joi.ref('$query.eType'), {
is: Joi.string().equal('search'),
then: Joi.required()
})