我想对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()
   })

07-28 09:31