首页 文章

(Apollo)GraphQL Merging架构

提问于
浏览
2

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

It is possible to merge remote GraphQL schema into a nested structure?

假设我有 n 远程模式,我想将来自不同模式的 QueryMutationSubscription 合并到一个模式中,除了每个远程模式都放在它们自己的 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 类型下,它包含两个包含远程模式中的查询类型的新类型 . 已使用 graphql-tools 中的变换器重新命名了来自模式 MenuXItem ,同样,来自模式 MenuYItem 也已被变换 .

但也有可能改变结构吗?

使用实际的远程模式,我们正在查看每个模式中的数百种类型,理想情况下,我希望不会污染GraphiQL中的根类型和Introspection文档 .

2 回答

  • 1

    Apollo的graphql-tools包含一个transform schemas的模块 . 你应该可以用 MenuX 重命名所有内容

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

    然后你可以use the transformed schema作为 mergeSchemas 的输入 .

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

  • 0

    可以实现模式,其中 Query 类型具有根字段作为源模式的入口点,但仅适用于 Query 类型,因为 Mutation 类型不支持在名称下嵌套突变 .

    因此,名称前缀是架构拼接的首选解决方案 .

相关问题