Joi 多个条件时

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。

met*_*kos 5

直接从文档复制。

当使用 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)