【问题标题】:How to use nested Joi schemas based on various conditionals如何使用基于各种条件的嵌套 Joi 模式
【发布时间】:2020-11-02 17:39:50
【问题描述】:

我已经研究这个特定问题大约一周了,但似乎找不到任何关于最新版本 JOI (17.3.0) 的可靠文档。

我试图实现的逻辑如下:

如果填充了 A,则需要 B OR C。

如果填充了 F,则需要 A AND K。 (如果 A 为空,则需要 F)

我一直在查看 Joi 文档并尝试了所提供功能的各种组合。这是我当前正在运行的代码,就所描述的逻辑而言,它并没有给我想要的东西。

const B = Joi.alternatives().conditional(Joi.ref('#B'), {is: Joi.boolean().valid(false), then : C.required(), otherwise: Joi.date().iso()}).allow("")


 const check = Joi.object().keys({
 
  //Name search
  A: A,
  B: B.when('A', {is: A.required(), then: B.required()}),
  C: C,

  F: F.when('A', {is: '', then: F.required()}),
  K: K.when('F', {is: F.required(), then: K.required()}),
  A: A.when('F', {is: F.required(), then: A.required()}),
   
}).unknown(true);

我知道这主要是基于架构的松散结构,所以我正在尝试看看是否有一种方法可以让我创建可以基于 AND 和 OR 语句等条件切换的嵌套架构。我已经看到其他人连接“何时”函数来构建自定义 OR(甚至 AND)条件,但不确定是否有更简洁的方法可以使用 Joi 17.3.0

主要问题是我需要根据条件来指导架构,而不是仅仅将信息扔到正文中,希望它能够正常工作。我没有收到任何语法错误,但是在发送请求时我没有收到我需要的正确响应/错误。

理想情况下,我希望它可以检查何时给出 A、B 或 C,或者是否给出 F AND K AND A,然后根据给出的内容,它可以使用正确的架构。

除此之外,我的所有引用都有一个 ".allow("")",因此当没有为不需要的引用分配任何内容时,架构不会引发错误。在了解 any.optional() 函数之前,我已经这样做了。不确定这是否是一个问题,但只是以防万一。

任何建议都会有所帮助。

【问题讨论】:

    标签: javascript node.js express validation joi


    【解决方案1】:

    我正在使用@hapi/joi

    joi.alternatives(
        joi.object({
            A: joi.string().required(),
            B: joi.string().required(),
            C: joi.string().allow(''),
        }),
        joi.object({
            A: joi.string().required(),
            B: joi.string().allow(''),
            C: joi.string().required(),
        }),
        joi.object({
            F: joi.string().required(),
            A: joi.string().required(),
            K: joi.string().required(),
        })
    )
    

    随意添加更多替代品。

    【讨论】:

      猜你喜欢
      • 2016-09-14
      • 2016-08-12
      • 2013-08-12
      • 2020-02-14
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      相关资源
      最近更新 更多