首页 > 解决方案 > (Apollo) GraphQL 合并模式

问题描述

我正在使用 Apollo 提供的 GraphQL 工具/库。

可以将远程 GraphQL 模式合并到嵌套结构中吗?

假设我有n远程模式,我想将不同模式的Query,Mutation和合并Subscription到一个模式中,除了每个远程模式都放在自己的type.

假设我们有一个名为的远程模式MenuX

type Item {
  id: Int!
  description: String
  cost: Int
}

type Query {
  items: [Item]
}

和一个名为的远程模式MenuY

type Item {
  id: Int!
  name: String
  cost: Int
}

type Query {
  items: [Item]
}

我想将模式合并到一个单一的模式中,但在它们自己的类型下。一个人为的例子:

type MenuXItem {
  id: Int!
  description: String
  cost: Int
}

type MenuYItem {
  id: Int!
  name: String
  cost: Int
}

type MenuXQuery {
  items: [MenuXItem]
}

type MenuYQuery {
  items: [MenuYItem]
}

type Query {
  MenuX: MenuXItem
  MenuY: MenuYItem
}

正如我们所看到的,在Query类型下它包含两个新类型,其中包含来自远程模式的查询类型。Itemfrom schemaMenuX已通过使用转换器 from 重命名graphql-tools,同样Itemfrom schemaMenuY也已转换。

但是是否也可以改变结构?

对于实际的远程模式,我们正在查看每个模式的数百种类型,理想情况下,我不想污染 GraphiQL 中的根类型和自省文档。

标签: node.jsgraphqlapollo-server

解决方案


Apollo 的 graphql-tools 包含一个转换模式的模块。你应该能够MenuX用类似的东西重命名所有东西

import {
  makeRemoteExecutableSchema,
  transformSchema,
  RenameTypes
} from 'graphql-tools';
const schema = makeRemoteExecutableSchema(...);
const menuXSchema = transformSchema(schema, [
  RenameTypes((name) => `MenuX${name}`)
]);

然后,您可以使用转换后的模式作为mergeSchemas.

请注意,顶级QueryMutation类型有些特殊,您可能希望尝试更直接地合并这些类型而不重命名它们,特别是如果它们不冲突。


推荐阅读