You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:36:02