You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Joi验证:当b或c(非同时)存在时如何设c为必填项

Joi 实现互斥字段下的必填规则

针对你提出的需求——禁止字段b和c同时存在,且在b或c存在(不同时)的情况下,c必须为必填项(即不允许单独存在b的情况),可以通过Joi的without和when组合实现,具体方案如下:

实现代码

const Joi = require('joi');

// 定义验证schema
const schema = Joi.object({
  a: Joi.string().optional(), // a为可选字段
  b: Joi.string().optional(),
  c: Joi.string().optional()
})
// 规则1:禁止b和c同时存在
.without('b', 'c')
// 规则2:当b存在时,c必须存在(杜绝单独存在b的情况)
.when(Joi.object({ b: Joi.exist() }).unknown(), {
  then: Joi.object({ c: Joi.required() })
});

规则说明

  1. without('b', 'c'):确保b和c两个字段不能同时出现在JSON中,直接拦截你提供的示例{a: '1', b: '2', c: '3'}这类同时包含b和c的非法数据。
  2. when条件规则:当检测到b字段存在时,强制要求c字段必须存在——这就保证了“b或c存在(不同时)”的场景下,c一定是必填的,避免了单独存在b的情况。

合法/非法示例

  • 合法数据:
    { "a": "1", "c": "3" }
    
    { "a": "1" }
    
  • 非法数据:
    { "a": "1", "b": "2" } // 单独存在b,不符合c必填要求
    
    { "a": "1", "b": "2", "c": "3" } // b和c同时存在,违反互斥规则
    

如果你的实际需求是“b和c互斥,且当b不存在时c必须必填(即不允许同时缺失b和c)”,可以调整为以下schema:

const schema = Joi.object({
  a: Joi.string().optional(),
  b: Joi.string().optional(),
  c: Joi.string().required()
})
.when(Joi.object({ b: Joi.exist() }).unknown(), {
  then: Joi.object({ c: Joi.forbidden() }),
  otherwise: Joi.object({ c: Joi.required() })
});

这个版本会强制要求:要么存在b(此时不能有c),要么存在c(此时不能有b),不允许同时缺失b和c。

内容的提问来源于stack exchange,提问作者Ola S Qutteineh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:48:20