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() }) });
规则说明
without('b', 'c'):确保b和c两个字段不能同时出现在JSON中,直接拦截你提供的示例{a: '1', b: '2', c: '3'}这类同时包含b和c的非法数据。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
相关产品推荐
相关产品推荐

