如何修改现有Joi schema以满足指定的多字段联动校验规则?
调整后的完整Joi Schema代码
const schema = Joi.object({ a: Joi.any() .when(Joi.object({ b: true }).unknown(), { then: Joi.forbidden() }) .when(Joi.object({ c: true }).unknown(), { then: Joi.forbidden() }) .required(), b: Joi.boolean().default(false), c: Joi.boolean().default(false) }) // 实现b、c不可同时为true的校验规则 .custom((value, helpers) => { if (value.b && value.c) { return helpers.message('字段b和c不可同时为true'); } return value; });
调整逻辑说明
- 字段a的规则通过Joi内置的
when条件校验实现:只要检测到b或c任意一个取值为true,就将a设为禁止传入状态,其余场景保留必填属性,完全匹配需求。 - b和c的互斥规则通过
custom自定义校验实现,直接判断两个字段的取值即可,比内置互斥方法更适配当前两个字段都有默认值、始终存在的场景,可读性更高。
校验效果验证
- 当b=true、c=false 或 b=false、c=true时,传入a字段会触发校验失败
- 当b=false、c=false时,不传入a字段会触发校验失败
- 当b=true、c=true时,直接触发自定义校验错误提示
内容的提问来源于stack exchange,提问作者A.A
相关产品推荐
相关产品推荐

