使用mergeSchemas的Apollo Server模式拼接,如何使用来自单独模式的类型?

Posted

技术标签:

【中文标题】使用mergeSchemas的Apollo Server模式拼接,如何使用来自单独模式的类型?【英文标题】:Apollo Server schema stitching using mergeSchemas, how to use a type from a separate schema? 【发布时间】:2019-06-22 01:13:31 【问题描述】:

我目前正在将架构从使用 graphql-js 定义迁移到使用 typedef 和解析器的可执行架构。我想迭代地迁移我的代码库并将它们拼接在一起。所以有些部分仍然使用graphql-js,有些部分使用gql typedefs,直到我开始做整个模式。

当我尝试在我的 typedef 中重用现有类型时遇到了问题。

例如我的 typedef 可能是:

type Query 
  customers: [User]

但是User 类型的定义存在于我的graphql-js 架构中。所以它会说Error: Type "User" not found in document 即使在模式被缝合之后。

这甚至可能吗,还是我必须一次迁移所有相关的东西?

例子:

// The original schema is created using graphql-js 
const oldSchema = new GraphQLSchema(query: ..., mutation: ...);

// The parts I'm slowly migrating to use graphql-tools
const newSchema = makeExecutableSchema( typeDefs: ..., resolvers: ...);

// Then putting them together
const mergedSchema = mergeSchemas(schemas: [oldSchema, newSchema])

【问题讨论】:

有趣的问题,你能添加你运行的方式mergeSchemas吗?不清楚您为什么在谈论 executableSchema 而不是在谈论 makeRemoteExecutableSchema @YevheniiHerasymchuk 感谢您的评论。原始模式是使用graphql-js 创建的,因此它使用:const oldSchema = new GraphQLSchema(query: ..., mutation: ...); 创建的部分我正在慢慢迁移以使用graphql-tools,例如:const newSchema = makeExecutableSchema( typeDefs: ..., resolvers: ...); 然后将它们放在一起:const mergedSchema = mergeSchemas(schemas: [oldSchema, newSchema]) 哦,我明白了,您的示例代码帮助很大。谢谢 【参考方案1】:

我不确定这是否适用于您的“旧架构”,但在我的项目中,我以以下方式将它们合并...

import requireGraphQLFile from 'require-graphql-file';
import makeExecutableSchema  from 'apollo-server';

const schema1= requireGraphQLFile('./schema/schema1');
const schema2= requireGraphQLFile('./schema/schema2');
const schema3= requireGraphQLFile('./schema/schema3');

const schema = makeExecutableSchema(
   typeDefs: [schema1,schema2, schema3],
   resolvers
);

【讨论】:

以上是关于使用mergeSchemas的Apollo Server模式拼接,如何使用来自单独模式的类型?的主要内容,如果未能解决你的问题,请参考以下文章

Apollo启动报Config service failed to start in 120 seconds! Please check ./service/apollo-ser

来自 GraphQLObjectType 模式的 graphql mergeSchemas

如果获得超过 1 个模式,Graphql 工具 mergeSchemas 会抛出错误

res.session 未定义 graphql apollo-server-express

与 apollo-server 的 Websocket 连接为 connectionParams 返回乱码

无法在 typescript 中配置 Apolloserver 的数据源