如何使用Joi的alternatives conditional实现依赖字段的Schema条件校验
问题根因
你的写法存在两处问题:
Joi.alternatives()用于定义多类型匹配规则,你没有指定name不等于test时的otherwise兜底规则,alternatives未匹配到分支时会默认跳过字段校验,导致触发条件后required规则没有生效- 这类单字段的条件校验不需要嵌套
alternatives,直接调用字段自身的条件校验方法即可
正确实现代码
const Joi = require('joi'); let test = async() => { const schema = Joi.object({ name: Joi.string().required(), // 直接对addr字段设置条件校验 addr: Joi.string().when('name', { is: 'test', then: Joi.required(), // 非test场景下addr为可选,可根据业务调整规则 otherwise: Joi.optional() }) }); const request = { name: "test" } const options = { abortEarly: false, allowUnknown: true, stripUnknown: true }; const validationResponse = await schema.validate(request, options); console.log("validationResponse => ", validationResponse); return true; }; test();
校验结果说明
修改后运行代码会输出包含error字段的校验结果,错误提示为"addr" is required,符合你预期的校验逻辑。
内容的提问来源于stack exchange,提问作者Dev1ce
相关产品推荐
相关产品推荐

