Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js (Apollo)GraphQL合并模式_Node.js_Graphql_Apollo Server - Fatal编程技术网

Node.js (Apollo)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

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

是否可以将远程GraphQL架构合并到嵌套结构中?

假设我有
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 as
Mutation
type不支持在名称下嵌套突变


出于这个原因,在模式拼接中,前缀名称是首选的解决方案。

有一个用于Gatsby的插件,其中包含一个转换器,可以实现您想要的功能:

它为现有GraphQL模式的类型命名空间,这样您就可以得到:

type Namespace1Item {
    ...
}

type Namespace2Item {
    ...
}

type Namespace1Query {
    items: [Namespace1Item]
}

type Namespace2Query {
    items: [Namespace2Item]
}

type Query {
    namespace1: Namespace1Query
    namespace2: Namespace2Query
}

因此,如果您转换模式并将其合并,您应该会做得很好。

不幸的是,这并不能回答“是否可以将远程GraphQL模式合并到嵌套结构中?”的问题。转换适用于根目录下的所有内容(查询、变异、订阅),但我也想将它们转换为嵌套结构(TFM说“根对象永远不会通过此转换重命名”,您确实明确要求过)。除非我遗漏了什么,否则重命名字段与将其嵌套在新零件项下是不同的。无论我在哪里看到,重命名字段以向名称添加前缀就是一个例子,但不将远程模式嵌套在新的父项下。这是可取的,以免污染根部。有什么想法吗?