如何用Joi实现互斥必填字段的验证规则?
Joi实现valueA与valueB的互斥非空验证
要实现你需要的“valueA为空时valueB必须有值,反之亦然”的互斥规则,可以借助Joi的xor()方法,配合字段的可选性与空值处理来完成。
修改后的Schema代码
const schema = Joi.object({ valueA: Joi.string() .pattern(/^\d+(,\d{1,2})?(\.\d{1,2})?$/) .optional() .empty(''), // 将空字符串视为未提供该字段 valueB: Joi.string() .pattern(/^\d+(,\d{1,2})?(\.\d{1,2})?$/) .optional() .empty('') }) .xor('valueA', 'valueB'); // 强制两个字段互斥,只能有一个存在且有效
关键规则说明
.optional():标记字段为非必填,因为不需要强制两个字段都存在.empty(''):把空字符串('')视为该字段未被提供,让Joi的互斥逻辑能正确识别“为空”的场景.xor('valueA', 'valueB'):核心规则,要求对象中必须且只能有valueA或valueB其中一个字段符合验证规则——既不能同时为空,也不能同时有值
验证场景示例
- 合法:
{ valueA: '123' }、{ valueB: '45.67' } - 非法:
{}(同时为空)、{ valueA: '123', valueB: '456' }(同时有值)、{ valueA: '', valueB: '' }(同时为空字符串)
内容的提问来源于stack exchange,提问作者Nicke7117
相关产品推荐
相关产品推荐

