【问题标题】:Joi multiple when condition条件时Joi多个
【发布时间】:2019-06-25 07:48:33
【问题描述】:

我想在我的身体里用 Joi 做一个验证,但它似乎永远不会起作用,并且一直处于相同的状态。 所以,如果我用这个 POST

端点:/elasticSearch?eType=scroll&scroll=1h

正文:{}

应该会抛出错误,因为 eType 是 scroll,在这种情况下 scroll_id 需要是必需的,不能为空,不能为空。

即使我用这个POST

端点:/elasticSearch?eType=search&scroll=1h

正文:{}

应该会引发错误,因为 eType 是 search 并且在这种情况下 query 需要必填。

所以有了这些代码,

在一种情况下,它总是像没有验证一样通过,即使在我看来它们不应该通过,而在第二种情况下,我得到错误:需要查询,并且当我制作时一直需要 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() 
     }
    ) 
   }

始终需要查询和滚动 ID。

【问题讨论】:

    标签: javascript node.js validation hapijs joi


    【解决方案1】:

    直接从文档中复制。

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

    【讨论】:

    • 如何知道我们是否使用 Joi.ref($...) 正确获取了值
    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多