要求 joi 对象中至少有一个允许 null 的非 null 子级

Set*_*day 5 validation schema joi hapi.js

我正在为一个对象定义一个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()
Run Code Online (Sandbox Code Playgroud)

除了以下对象被认为是有效的之外,这非常有效:

{
    facebook : null,
    twitter  : null,
    youtube  : null
}
Run Code Online (Sandbox Code Playgroud)

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

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

这用于有效负载验证,如果知道客户端理解完整模式,因此希望所有字段都存在,那就太好了。也许这不值得。我确实感觉到我可以使用一些冗长的when()代码来完成工作,但似乎在那时我也可以制作自己的循环。希望被证明是错误的!

小智 2

这是准备好的答案:使用 Joi,要求两个字段之一非空

joi 有.alternatives() 方法,该.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(),
  }),
);
Run Code Online (Sandbox Code Playgroud)

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