如何在Joi中实现flag处于0-2区间时headId必填的正确验证?
解决Joi中基于区间条件的必填字段验证问题
嗨,我明白你遇到的问题了——原来的when条件用数组精确匹配[0,1,2]虽然能暂时覆盖需求,但如果后续flag的范围调整,这种写法维护起来很麻烦,而且你想要的是区间匹配的逻辑对吧?
其实Joi的when条件支持用完整的Joi schema来做判断,而不只是固定值数组。针对你的需求,只需要把is部分改成区间验证就可以了:
const schema = Joi.object({ flag: Joi.number().integer().min(0).max(5).required(), headId: Joi.string().when('flag', { // 当flag是0-2之间的整数时 is: Joi.number().integer().min(0).max(2), then: Joi.string().required(), // 其他情况(flag为3、4、5)时,headId可选 otherwise: Joi.string().optional() }) });
为什么原来的写法不够理想?
你之前的is:[0,1,2]是精确匹配这三个固定值,虽然当前flag被限制在0-5之间,逻辑上能覆盖需求,但如果未来flag的允许范围扩展(比如改成0-10),你就得手动更新数组里的值,而用区间验证的写法就不需要改动,更灵活也更贴合你“区间判断”的初衷。
额外小提示
如果想让headId在非必填时允许null或者空字符串,可以把otherwise改成:
otherwise: Joi.string().allow(null, '').optional()
这样就能完美实现你要的逻辑啦~
内容的提问来源于stack exchange,提问作者bmayank
相关产品推荐
相关产品推荐

