使用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