Node.js (Apollo)GraphQL合并模式
我正在使用Apollo提供的GraphQL工具/库 是否可以将远程GraphQL架构合并到嵌套结构中? 假设我有Node.js (Apollo)GraphQL合并模式,node.js,graphql,apollo-server,Node.js,Graphql,Apollo Server,我正在使用Apollo提供的GraphQL工具/库 是否可以将远程GraphQL架构合并到嵌套结构中? 假设我有n远程模式,我想将来自不同模式的查询、变异和订阅合并到一个模式中,但每个远程模式都放在各自的类型下 假设我们有一个名为MenuX的远程模式,其中包含: type Item { id: Int! description: String cost: Int } type Query { items: [Item] } 以及一个名为MenuY的远程模式,其中包含: typ
n
远程模式,我想将来自不同模式的查询
、变异
和订阅
合并到一个模式中,但每个远程模式都放在各自的类型
下
假设我们有一个名为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
类型下,它包含两个新类型,其中包含来自远程模式的查询类型<模式MenuX
中的code>Item已使用graphql工具中的转换器重命名,类似地,模式MenuY
中的Item
也已转换
但是,是否有可能改变这种结构呢
对于实际的远程模式,我们正在查看每个模式中的数百种类型,理想情况下,我不希望污染GraphiQL中的根类型和内省文档。Apollo的graphql工具包括一个用于访问的模块。您应该能够使用以下命令重命名MenuX
中的所有内容
import {
makeRemoteExecutableSchema,
transformSchema,
RenameTypes
} from 'graphql-tools';
const schema = makeRemoteExecutableSchema(...);
const menuXSchema = transformSchema(schema, [
RenameTypes((name) => `MenuX${name}`)
]);
然后,您可以将其作为mergeSchemas
的输入
请注意,顶级的查询
和变异
类型有些特殊,您可能希望尝试更直接地合并这些类型而不重命名它们,特别是在它们不冲突的情况下。可以实现模式,其中查询
类型将根字段作为源模式的入口点,但仅对于Query
type asMutation
type不支持在名称下嵌套突变
出于这个原因,在模式拼接中,前缀名称是首选的解决方案。有一个用于Gatsby的插件,其中包含一个转换器,可以实现您想要的功能:
它为现有GraphQL模式的类型命名空间,这样您就可以得到:
type Namespace1Item {
...
}
type Namespace2Item {
...
}
type Namespace1Query {
items: [Namespace1Item]
}
type Namespace2Query {
items: [Namespace2Item]
}
type Query {
namespace1: Namespace1Query
namespace2: Namespace2Query
}
因此,如果您转换模式并将其合并,您应该会做得很好。不幸的是,这并不能回答“是否可以将远程GraphQL模式合并到嵌套结构中?”的问题。转换适用于根目录下的所有内容(查询、变异、订阅),但我也想将它们转换为嵌套结构(TFM说“根对象永远不会通过此转换重命名”,您确实明确要求过)。除非我遗漏了什么,否则重命名字段与将其嵌套在新零件项下是不同的。无论我在哪里看到,重命名字段以向名称添加前缀就是一个例子,但不将远程模式嵌套在新的父项下。这是可取的,以免污染根部。有什么想法吗?