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