Apollo Federation 错误代码
组合错误代码参考
当GraphOS 尝试将您提供的 子图 组合成 supergraph 架构,它确认:
- 子图拥有有效的 GraphQL 和 Federation 语法
- 生成的 supergraph 架构 是有效的
- graph 路由器 或 gateway 拥有执行针对该结构 操作 所需的所有信息
如果 组合 失败,则无法生成新的 supergraph 架构。此 文档 列出子图验证和组合错误代码及其根本原因。
ⓘ 注意
组合 可能会标记出潜在改进或 提示 有关 schemas(这些 schemas 在技术上有效)。这些提示不是错误,而是作为 composition 构建步骤的一部分进行记录。了解更多信息,请参阅 组合提示文档。
错误
以下错误可能在 组合 期间引发:
错误代码 / 最低 Federation 版本 | 描述 |
---|---|
| 一个元素被标记为 |
| 组合自定义指令时出现错误。 |
| 内置或联盟指令在模式中定义无效。 |
| 一个标记为 |
| 表示在联盟服务查询执行期间,子图服务subgraph查询中出现错误。 |
| 枚举类型定义没有在所有subgraphs中定义的值。合并该类型会导致无效的空枚举类型。 |
| 输入对象类型没有在所有定义该类型的subgraphs中定义的公共字段。合并该类型会导致无效的空输入对象类型。 |
| 用作输入和输出类型的枚举类型具有在定义该枚举类型的所有subgraphs中未定义的值。 |
| 一个subgraph试图 |
| 一个 |
| 一个 |
| 一个 |
| 在某些情况下, |
| 字段在子图中被标记为 |
| 接口类型的字段通过 |
| 一个 |
| 一个 |
| 字段(或指令)的一个参数的默认值与其他子图中相同参数的其他声明不兼容。 |
| 字段(或指令)的一个参数的类型与其他子图中相同参数的其他声明不兼容。 |
| 字段有一个与其他子图中该字段的声明不兼容的类型。 |
| 元素被标记为 |
| 一个输入字段有一个与其他子图中该字段的其他声明不兼容的默认值。 |
| 在子图合并后,一个实现缺少它实现的一个接口的一个字段(这在有效的子图中可能发生)。 |
| 一个子图在接口类型上有 |
| 一个 |
|
|
| 表示为Apollo Federation超图提供的模式不是一个有效的supergraph模式。 |
| 至少有一个子图中不可共享的字段被多个子图解析。 |
| 模式无效GraphQL:它违反了规范中的某个规则。 |
| @link |
| @link |
| @shareable |
| 子图名称无效。 (子图名称不能仅有一个下划线 ( |
| @key |
| @key |
| @key |
| 传递给 @key 指令的 |
| @key |
| 在接口上使用 @key 指令,这只在连接到 Federation v2.3 或更高版本时受支持。 |
| 合并指令(由相关 @link(import:) 参数声明)的导入名称在子图中不一致。 |
| 在子图中,一个字段同时被标记为 @external 并对其应用了合并指令。 |
| 没有组成的子图暴露任何查询。 |
| API 模式表中可见的类型只有 @inaccessible 的孩子。 |
| @override 指令不能用于外部字段,也不能用来覆盖带有 @external、@provides 或 @requires 的字段。 |
| 字段含 |
| 指令 |
| 指令 |
| 将字段重写为另一个子图的字段也标记为 |
| 指令 |
| 指令 |
| 指令 |
| 传递给指令 |
| 指令 |
| 指令 |
| 指令 |
| 元素被标记为 |
| 元素被标记为 |
| 字段或指令定义的一个参数在一些子图中是强制性的,但该参数未定义在定义字段或指令定义的所有子图中。 |
| 元素被标记为 |
| 在A字段中,某些子图要求输入对象类型必须包含该字段,但在定义输入对象类型的所有子图中并非都对该字段进行了定义。 |
| @requires指令的 |
| @requires指令的 |
| 传递给@requires指令的 |
| @requires指令的 |
| 在接口上使用了@requires指令,而这目前不支持。 |
| 子图的模式定义了一个名为mutation的类型,同时也指定了不同的类型名称作为根查询对象。这是不允许的。 |
| 子图的模式定义了一个名为query的类型,同时也指定了不同的类型名称作为根查询对象。这是不允许的。 |
| 子图的模式定义了一个名为subscription的类型,同时也指定了不同的类型名称作为根查询对象。这是不允许的。 |
| 子图可以合并,但生成的超图API将包含无法由那些子图满足的查询。 |
| 可共享字段返回类型在声明字段的子图中具有不匹配的可能运行时类型。由于所有子图中共享字段必须以相同的方式解决,这几乎肯定是错误。 |
| @sourceAPI指令必须指定一个有效的http.baseURL。 |
| 每个@sourceAPI指令必须接受一个独特且有效的名称作为参数。 |
| 每个@sourceAPI指令必须指定已知的协议之一。 |
| 使用@source{API,Type,Field}指令的架构必须使用Federation v2.7 或更高版本的@link imported。 |
| @sourceField指令的api参数必须匹配一个有效的@sourceAPI名称。 |
| 如果 |
| @sourceField指令必须指定http.{GET,POST,PUT,PATCH,DELETE}中最多一个。 |
| @sourceField指令必须指定http.{GET,POST,PUT,PATCH,DELETE}的有效URL模板。 |
| @sourceField指令必须应用于Query或Mutation类型的字段,或者应用在类型为实体类型的字段上。 |
| 如果@sourceField指定了协议,它必须与相应的@sourceAPI协议匹配。 |
| @sourceField指令的selection参数必须是一个有效的 |
| @source*指令的http.headers参数必须指定有效的HTTP头。 |
| @sourceType指令的api参数必须与有效的@sourceAPI名称匹配。 |
| 如果@sourceType指定了http.body,它必须是一个有效的JSONSelection。 |
| @sourceType指令必须指定http.GET或http.POST中确切的一个。 |
| @sourceType指令必须指定http.GET或http.POST的有效URL模板。 |
| @sourceType指令必须应用于具有@key的对象或接口类型。 |
| @sourceType指令必须指定与相应的@sourceAPI相同的协议。 |
| @sourceType指令的selection参数必须是一个有效的JSONSelection,该参数输出GraphQL类型的字段。 |
| 在模式中有一个内置或Federation类型有无效的定义。 |
| 在同一子图中,一个类型的名称可能不同,但其类型不同。例如,一个定义是对象类型,而另一个是接口。 替换 |
| Federation 1 项具有只包含未使用外部字段的复合类型。请注意,此错误只会针对 Federation 1 项引发,因为 Federation 2 项不允许使用未使用的字段(在这种情况下,将引发带有代码 |
| 在架构上的 |
| 在架构上设置的 |
| 表示由于 Federation 当前不支持该功能而引发错误。 |
| 表示在 |
已删除的代码
以下错误代码已被删除,并由最新版本的 @apollo/gateway
库不再生成:
已删除代码 | 注释 |
---|---|
| 由于重复枚举定义是无效的 GraphQL,这现在将是一个带有代码 |
| 由于在 GraphQL 中重复枚举值是无效的,这现在将是一个带有代码 |
| 由于在 GraphQL 中重复标量定义是无效的,这现在将是一个带有代码 |
| 子图中对枚举的定义现在通过组合进行合并。 |
| 由于不再有类型权限,因此现在没有特定限制,说明字段可以被外部使用。 |
| 此错误由引入的验证引发,以避免遇到已知运行时错误。由于 Federation v2.3,底层的运行时错误已被解决,因此不再需要验证/限制,并且已将其删除。 |
| 现在不建议对键字段使用 |
| 键现在可以使用任何其他子图的任何字段。 |
| 每个子图现在只有在需要时才能声明一个键。 |
| 每个子图可以独立于任何其他子图声明一个键。 |
| 每个子图可以拥有所需的多个键。 |
| 从 Federation v2.1.0 版本开始,此错误原来覆盖的情况现在变为警告(代码 |
|
|
|
|
| 从 Federation v2.1.1 版本开始,在 @requires 中使用带参数的 fields 完全被支持。 |
| 字段在 @requires 中现在可以从任何子图中获取。 |
| 由于不再有类型所有权,没有哪个子图可以使用 @requires 的特定限制。 |
| 此错误以前执行不正确:服务和实体(如果存在)被覆盖;情况依然是如此。 |
| 在模型中(它们只是使用模式),实体类型和值类型之间没有强烈的区别,并且类型可以在一个子图中具有键但在另一个子图中没有。 |
| 现在通过合成合并联合的子图定义。 |