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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:45:00