sam*_*ote 1 javascript validation node.js joi hapi.js
我想用 Joi 在我的身体中进行验证,但它似乎永远不起作用并且总是处于相同的状态。所以如果我用这个发布
端点:/elasticSearch?eType=scroll&scroll=1h
身体:{}
应该会抛出错误,因为 eType 是滚动的,在这种情况下,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()
}
)
}
Run Code Online (Sandbox Code Playgroud)
这始终需要查询和scroll_id。
直接从文档复制。
当使用 Joi 验证对象时,其他输入的值(即 headers、query、params、payload 和 auth)在验证上下文中可用(可在规则中通过 Joi.ref('$query.key') 访问)。
Joi.ref('$query.eType')因此,在您的eType引用中使用,因为您尝试根据查询参数验证有效负载,在验证阶段,它们位于不同的范围内。
Joi.alternatives()
.when(Joi.ref('$query.eType'), {
is: Joi.string().equal('search'),
then: Joi.required()
})
Run Code Online (Sandbox Code Playgroud)