在joi对象中至少需要一个允许null的非null子元素

时间:2017-07-15 23:09:15

标签: validation schema hapijs joi

我正在为一个对象定义一个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()代码来完成工作,但似乎在那一点上我可能只是制作自己的循环。希望被证明是错误的!

2 个答案:

答案 0 :(得分:1)

这里准备好了答案: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()

答案 1 :(得分:0)

您可以使用oxor运算符,here's一个描述。它适用于我的情况,我是两个不能同时使用的字段,但是如果两个字段都未使用,那么我就不会像使用xor一样收到任何警告。