我正在定义一个 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()代码来完成工作,但在那时我似乎还不如自己做一个循环。希望被证明是错误的!
最佳答案
这是准备好的答案:Using Joi, require one of two fields to be non empty
乔伊有.alternatives()
method ,即有 .try()
您可以简单地浏览所有选项的方法
在每种情况下,您只能保留一个 required
field
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()
关于validation - 要求 joi 对象中至少有一个允许 null 的非 null 子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45123536/