Joi条件校验两个Schema时出现Invalid schema content错误如何解决
条件校验Schema抛出Error [ERR_ASSERTION]: Invalid schema content的常见遗漏配置及修复方案
这个错误本质是你编写的Schema结构不符合校验库的语法规范,针对isCat字段的条件校验场景,常见遗漏点如下:
1. 条件关键字层级错误
如果使用AJV等兼容JSON Schema规范的校验库,if/then/else条件关键字必须和properties、required平级,不能嵌套在properties内部:
错误示例:
{ "type": "object", "properties": { "isCat": { "type": "boolean" }, "if": { "properties": { "isCat": { "const": true } } }, "then": { "required": ["catName"] } } }正确示例:
{ "type": "object", "properties": { "isCat": { "type": "boolean" }, "catName": { "type": "string" }, "dogName": { "type": "string" } }, "if": { "properties": { "isCat": { "const": true } } }, "then": { "required": ["catName"] }, "else": { "required": ["dogName"] } }
2. 条件分支字段未提前声明
then/else分支中用到的所有字段,必须先在顶层properties中完成规则定义,不能只在条件分支内写字段校验规则,否则会被识别为无效Schema内容。
3. 校验库未开启条件校验支持
旧版AJV需要手动开启对应配置,Fastify等封装了校验能力的框架,也需要在初始化配置中显式开启对if/then/else条件关键字的支持,否则会将其识别为非法字段。
4. 校验库语法混用
如果使用Joi这类声明式校验库,不要用JSON Schema的if/then/else写法,要使用Joi自带的when方法实现条件校验:
const schema = Joi.object({ isCat: Joi.boolean().required(), catName: Joi.string(), dogName: Joi.string() }).when(Joi.object({ isCat: Joi.boolean().valid(true) }).unknown(), { then: Joi.object({ catName: Joi.required() }), otherwise: Joi.object({ dogName: Joi.required() }) })
错误传入JSON Schema格式的配置给Joi会直接触发上述断言错误。
5. 存在未注册的自定义校验关键字
如果Schema中使用了自定义校验规则,没有提前给校验库注册对应关键字的处理逻辑,也会抛出无效Schema的错误。
内容的提问来源于stack exchange,提问作者Or Assayag
相关产品推荐
相关产品推荐

