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

标签 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()代码来完成工作,但在那时我似乎还不如自己做一个循环。希望被证明是错误的!

最佳答案

这是准备好的答案: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/

相关文章:

hapijs - 哈皮回复文件

iframe - 如何在 iframe 中拥有 Keycloak 登录页面?

url - 如何在 Hapi 中获取请求的完整 URL

html - 如何使用 JTidy 从解析的 HTML 中获取错误/警告消息?

postgresql - 如何在 PostgreSQL 中导出数据库的架构?

lisp - S-表达式的良好形式/模式

数据库架构 - 预订/可用性系统

javascript - 在 Angular 中, $pending 仅在 $asyncValidators 的表单上设置吗?

c++ - C++ 中的数值数据验证

validation - 如何在自定义多字段验证器中将其他组件标记为无效