【问题标题】:Require at least one non-null child in joi object that allows null在允许 null 的 joi 对象中至少需要一个非 null 子节点
【发布时间】:2017-12-20 18:27:21
【问题描述】:

我正在为一个对象定义一个Joi 架构,其中包含一些社交资料字段。目标是确保所有字段都存在,并且至少其中一个是非空字符串,但允许其他字段为 null

这是我目前所拥有的:

const socialUrl = joi.string().min(1).alphanum().allow(null);
const schema = joi.object({
    facebook : socialUrl.required(),
    twitter  : socialUrl.required(),
    youtube  : socialUrl.required()
}).required()

这很好用,除了以下对象被认为是有效的:

{
    facebook : null,
    twitter  : null,
    youtube  : null
}

在对象上使用min()or() 并没有帮助,因为字段存在,它们只是错误的类型。

之后自己做一个额外的循环并检查所有字段为null 的具体情况是非常简单的,但这并不理想。

这被用于payload validation,如果知道客户端理解完整的模式会很高兴,因此希望所有字段都存在。也许这不值得。我确实觉得我可以使用一些冗长的when() 代码来完成工作,但似乎那时我还不如自己做一个循环。希望被证明是错误的!

【问题讨论】:

    标签: validation schema hapijs joi


    【解决方案1】:

    您可以使用oxor 运算符、here's 进行描述。它适用于我的情况,我是 2 个不能同时使用的字段,但如果它们都没有被使用,我不想收到任何警告,就像我使用了 xor...

    【讨论】:

      【解决方案2】:

      这里有现成的答案:Using Joi, require one of two fields to be non empty

      joi 有.alternatives() method,有.try() 方法,您可以在其中简单地浏览所有选项 在每种情况下,您必须只保留一个 required 字段

      const socialUrl = joi.string().min(1).alphanum().allow(null);
      
      const schema = joi.alternatives().try(
        joi.object({
          facebook: socialUrl.required(),
          twitter: socialUrl,
          youtube: socialUrl,
        }),
        joi.object({
          facebook: socialUrl,
          twitter: socialUrl.required(),
          youtube: socialUrl,
        }),
        joi.object({
          facebook: socialUrl,
          twitter: socialUrl,
          youtube: socialUrl.required(),
        }),
      );
      

      所以,您不需要使用.min().or()

      【讨论】:

      • 您好,感谢您的帮助。不幸的是,这并不能验证所有字段都存在。所以像{ facebook : 'foo' } 这样的对象验证成功,我想要求输入是{ facebook : 'foo', twitter : null, youtube : null }
      • @SethHolladay 你能给我至少一三个有效和无效的例子吗?
      • 当然!我做了一个带有测试的回购@IlnurIbat 见github.com/sholladay/repro-so-45123536
      猜你喜欢
      • 2010-11-30
      • 1970-01-01
      • 2016-08-29
      • 2022-11-12
      • 2021-07-06
      • 1970-01-01
      • 2011-07-21
      • 2021-04-17
      • 1970-01-01
      相关资源
      最近更新 更多