Joi HTTP请求体验证:如何实现keyA与keyB二选一必填且互斥?
解决Joi中“二选一必填且不能同时存在”的校验问题
嘿,我太懂你这个困扰了——用双向when确实会触发循环依赖,毕竟两个字段互相盯着对方的存在性判断,Joi肯定懵圈。其实官方文档里有个专门的方法能搞定这个需求,就是xor,既简洁又不会有循环问题!
正确的Schema实现
直接用xor方法来定义“恰好存在其中一个字段”的规则,再给每个字段加上各自的格式校验:
const messageSchema = Joi.object({ keyA: Joi.string(), keyB: Joi.string().uri() }).xor('keyA', 'keyB');
为什么这个方案可行?
xor('keyA', 'keyB'):这个方法会强制要求两个字段中恰好存在一个——既不能同时提供keyA和keyB,也不能两个都不提供,完美匹配你的需求- 每个字段的格式校验(
Joi.string()、Joi.string().uri())可以单独定义,互不干扰 - 完全避开了循环依赖的问题,因为不需要字段之间互相引用判断
为什么你之前的代码会出问题?
你原来的双向when写法,会让Joi在校验keyA时去检查keyB是否存在,校验keyB时又回头检查keyA是否存在,形成了循环引用链,Joi无法处理这种互相依赖的判断逻辑,所以才会出现循环依赖的报错。
内容的提问来源于stack exchange,提问作者Pierre Clocher
相关产品推荐
相关产品推荐

