Joi验证问题:.or条件未生效,提示INVERTED_ROW必填
Joi .or() 规则失效提示字段必填的原因及解决方法
可能的原因及对应解决方式:
全局验证选项强制所有字段必填
如果你在调用validate()时传入了{ presence: 'required' }参数,Joi会强制要求schema中定义的所有字段必须存在,这会直接覆盖.or()的“至少存在一个”规则。比如:// 错误用法:该选项会让所有字段变为必填 PAYLOAD.validate(yourPayload, { presence: 'required' });解决:移除这个全局选项,仅针对需要必填的字段单独设置
.required()。Schema被后续代码意外修改
检查是否在定义PAYLOAD之后,对某个字段(比如INVERTED_ROW)添加了.required()约束,或者对整个schema调用了.required(),导致所有字段被强制要求存在。比如:// 错误示例:后续修改导致字段必填 PAYLOAD.extract('INVERTED_ROW').required(); // 或者 PAYLOAD.required();解决:排查代码中对
PAYLOAD的后续操作,确保没有额外添加必填规则。Schema与其他带必填约束的Schema合并
如果你的PAYLOAD通过.concat()等方法和其他Schema合并,而另一个Schema中对INVERTED_ROW设置了必填规则,也会触发这个错误。
验证排查步骤
可以先单独测试你的Schema,排除其他代码干扰:
const testPayload = { "BACK_EXTENSION": { "reps": 30, "exerciseId": 7 }, "PUSH_UP": { "reps": 1, "exerciseId": 1 } }; const { error } = PAYLOAD.validate(testPayload); console.log(error); // 正常情况下应该输出undefined
如果测试无问题,说明问题出在验证选项或Schema的后续修改上。
内容的提问来源于stack exchange,提问作者kriskanya
相关产品推荐
相关产品推荐

