(Apollo) GraphQL 合并模式(schema)

4
我正在使用由Apollo提供的GraphQL工具/库。
有可能将远程GraphQL模式合并成嵌套结构吗?
假设我有n个远程模式,并且我想将不同模式中的Query,Mutation和Subscription合并到单个模式中,除了每个远程模式都被放置在其自己的类型下之外。
假设我们有一个名为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重命名,同样地,模式MenuY中的Item也被转换了。

但是,是否可能同时改变结构呢?

实际上,我们需要处理每个模式中数百种类型,理想情况下,我不希望污染根类型和GraphiQL中的内省文档。

3个回答

2
阿波罗的graphql-tools包括一个模块,用于转换模式。您可以使用类似以下代码来重命名MenuX中的所有内容: transform schemas.
import {
  makeRemoteExecutableSchema,
  transformSchema,
  RenameTypes
} from 'graphql-tools';
const schema = makeRemoteExecutableSchema(...);
const menuXSchema = transformSchema(schema, [
  RenameTypes((name) => `MenuX${name}`)
]);

然后,您可以将转换后的模式用作mergeSchemas的输入。

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


1
不幸的是,这并没有回答“是否可以将远程GraphQL模式合并到嵌套结构中?” 转换对于根下的所有内容(查询、变异、订阅)都很好,但我也想将它们转换为嵌套结构。 - Bill
(TFM说:“根对象永远不会被此转换重命名”,而您确实要求了这一点。) - David Maze
除非我漏掉了什么,否则重命名字段并不等同于将其嵌套在新的父级项目下。无论我看哪里,都是将字段重命名以添加前缀到_name_的示例,但没有将远程模式嵌套在新父级下的示例。这是可取的,以避免污染根级别。有任何想法吗? - Atomox

1

有一个适用于Gatsby的插件,其中包含一个转换器,可以实现您想要的功能:https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-source-graphql/src/transforms.js

它将现有的GraphQL模式类型进行命名空间处理,因此您最终会得到:

type Namespace1Item {
    ...
}

type Namespace2Item {
    ...
}

type Namespace1Query {
    items: [Namespace1Item]
}

type Namespace2Query {
    items: [Namespace2Item]
}

type Query {
    namespace1: Namespace1Query
    namespace2: Namespace2Query
}

所以,如果您转换了模式并将它们合并,那么您应该没问题。

0

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

因此,为了模式拼接,前缀命名是首选解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接