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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:15:04