Joi带switch选项的多条件备选验证schema失效问题求助
问题原因与解决方案
核心问题
你用alternatives.conditional的switch选项时验证失败,根源在于路径引用错误,导致Joi没有正确匹配到对应子schema,反而触发了不相关的验证规则:
- 你的
switch写法中,conditional('type', { switch: [...] })里的type是引用根对象下的字段,但实际你的type字段是在task对象内部的,这导致所有switchcase的is条件都不满足。 - 当没有匹配的case时,Joi的 fallback 行为会默认应用第一个
then对应的categorySchema,而该schema要求retailer_category_id为必填非空字符串,你的数据中该字段为空,因此触发错误。 - 嵌套式
conditional写法之所以正常,是因为它直接用schema检查当前task对象的type字段,条件匹配时只会应用对应的子schema,不会触发其他无关验证。
修正方案
以下三种方法都可以解决问题,选择最适合你的写法:
方案一:修正路径引用(Joi v17+适用)
使用相对路径./type引用task内部的type字段,确保条件判断针对正确的字段:
const taskSchemaWithSwitch = Joi.object({ task: Joi.alternatives().conditional('./type', { switch: [ { is: Joi.string().valid('category'), then: categorySchema, }, { is: Joi.string().valid('detail'), then: productSchema, }, { is: Joi.string().valid('search'), then: searchTermsSchema, }, ], }), });
方案二:改用schema作为条件(逻辑和嵌套式一致)
直接用schema检查task对象的type字段,避免路径引用错误:
const taskSchemaWithSwitch = Joi.object({ task: Joi.alternatives().conditional(Joi.any(), { switch: [ { is: Joi.object({ type: Joi.string().valid('category') }).unknown(true), then: categorySchema, }, { is: Joi.object({ type: Joi.string().valid('detail') }).unknown(true), then: productSchema, }, { is: Joi.object({ type: Joi.string().valid('search') }).unknown(true), then: searchTermsSchema, }, ], }), });
方案三:更简洁的object.when写法
将公共字段和条件判断合并到同一个object schema中,结构更清晰:
const taskSchemaWithSwitch = Joi.object({ task: Joi.object({ type: Joi.string().valid('category', 'detail', 'search').required(), id: Joi.number().integer().required(), retailer_id: Joi.string().required(), crawler_id: Joi.string().required(), enable_multi_store: Joi.boolean(), }).when('type', { switch: [ { is: 'category', then: Joi.object({ retailer_category_id: Joi.string().required(), journey: Joi.string(), }) }, { is: 'detail', then: Joi.object({ retailer_product_id: Joi.string().required(), journey: Joi.string(), }) }, { is: 'search', then: Joi.object({ search_term: Joi.string().required(), }) } ] }).unknown(true) });
内容的提问来源于stack exchange,提问作者AnandShiva
相关产品推荐
相关产品推荐

