Joi不接受合法字符串值且仅生产环境触发校验错误问题咨询
问题根因
你遇到的报错核心原因是**valid方法接收到的合法值参数类型不符合预期**:报错提示中出现[object Set],说明providersForSubscriptions、providersForProducts两个变量在生产环境实际是Set类型,而非你预期的数组类型。
之所以仅生产环境触发报错,是因为本地运行的浏览器原生支持Set的迭代器语法,...Set可以正常展开为内部元素列表;而生产环境的构建转译配置未兼容Set的展开操作,导致...providersForSubscriptions、...providersForProducts没有展开为字符串列表,而是直接把整个Set作为单个参数传入了valid方法。此时Joi会把整个Set对象判定为唯一合法值,你传入的zencore字符串自然无法匹配校验规则。
修复方案
不需要重构整个校验schema,只需对传入valid的参数做一层数组转换,规避展开语法的兼容性问题即可,修改后的校验规则如下:
provider: Joi.string().required().label('Provider').when('entitlementType', { is: 'Offer', then: Joi.string().valid(...Array.from(providersForSubscriptions)), otherwise: Joi.string().valid(...Array.from(providersForProducts)), }),
Array.from可以统一把数组、Set等可迭代对象转为标准数组,后续展开操作就能稳定输出字符串列表,兼容所有环境。
如果业务中不需要用到Set存储可选值,也可以直接在定义providersForSubscriptions、providersForProducts时就固定为数组类型,从根源避免类型不一致问题。
内容的提问来源于stack exchange,提问作者Fer Toasted
相关产品推荐
相关产品推荐

