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
相关产品推荐
相关产品推荐

