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

Joi校验需求:实现answertext与answerurl二选一必填

解决方案

你可以通过Joi的条件校验(.when())实现「answertext和answerurl二者必填其一」的需求,下面是调整后的完整代码:

PostAnswer(obj){
    const schema = Joi.object({
        questionguid: Joi.string().required(),
        answertext: Joi.string().allow(null, "").when('answerurl', {
            // 当answerurl为空或null时,answertext必须为有效非空字符串
            is: Joi.string().empty(['', null]),
            then: Joi.string().required(),
            otherwise: Joi.string().allow(null, "")
        }),
        answerurl: Joi.string().allow(null, "").when('answertext', {
            // 当answertext为空或null时,answerurl必须为有效非空字符串
            is: Joi.string().empty(['', null]),
            then: Joi.string().required(),
            otherwise: Joi.string().allow(null, "")
        }),
        transcriptiontext: Joi.string().allow(null,""),
        threadguid: Joi.string().required()
    })
    return schema.validate(obj)
}

改动说明:

  • 移除原代码中answertext的.required(),改为允许空值和null
  • 给answertext和answerurl分别添加.when()条件校验:
    • 当其中一个字段为空或null时,强制要求另一个字段为有效非空字符串
    • 如果两个字段都传入了非空值,也会正常通过校验(满足「至少一个必填」的核心要求)

如果你的需求是两个字段不能同时填写(互斥必填),可以改用Joi的.xor()方法实现:

PostAnswer(obj){
    const schema = Joi.object({
        questionguid: Joi.string().required(),
        answertext: Joi.string().allow(null, ""),
        answerurl: Joi.string().allow(null, ""),
        transcriptiontext: Joi.string().allow(null,""),
        threadguid: Joi.string().required()
    })
    // 互斥规则:只能填写其中一个字段,不能同时提交
    .xor('answertext', 'answerurl')
    // 确保填写的字段是有效非空字符串
    .with('answertext', Joi.string().not().empty(['', null]))
    .with('answerurl', Joi.string().not().empty(['', null]))
    return schema.validate(obj)
}

内容的提问来源于stack exchange,提问作者user15421419

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:45:41