GraphQL Apollo Schema委托问题:info.mergeInfo未定义
解决GraphQL Schema委托中
mergeInfo不存在的问题 你遇到的问题核心是依赖库版本差异或者缺少Schema Stitching的必要配置,下面分情况帮你梳理清楚:
1. 先确认你使用的依赖库版本
mergeInfo这个属性是旧版graphql-tools(v4及更早版本)中Schema Stitching特性的专属产物,而在后续版本(v5+)以及Apollo的Schema Federation方案中,这个属性已经被移除或替换:
- 如果你现在用的是
@graphql-tools/delegate、@graphql-tools/schema这类v5+的包,mergeInfo不会出现在GraphQLResolveInfo里,官方文档如果还写着用info.mergeInfo.delegateSchema,那大概率是文档没跟上版本更新。 - 如果你用的是Apollo Gateway(Schema Federation方案),那本身就不会有
mergeInfo,Federation有自己的服务间调用逻辑,不需要通过这个属性实现委托。
2. 对应版本的正确实现方式
情况一:使用graphql-tools v5+
现在不需要从info里取mergeInfo,而是直接导入delegateToSchema函数来实现Schema委托:
import { delegateToSchema } from '@graphql-tools/delegate'; const yourResolver = (parent, args, ctx, info) => { return delegateToSchema({ schema: yourTargetSubschema, // 你要委托的目标Schema operation: 'query', // 可选值:'query'/'mutation'/'subscription' fieldName: 'targetFieldName', // 目标Schema中要调用的字段名 args, context: ctx, info, // 其他可选配置,比如字段转换规则等 }); };
情况二:使用旧版graphql-tools(v4及以下)
如果你坚持用旧版,必须确保你是通过mergeSchemas函数来合并多个Schema的——只有这样,mergeInfo才会被自动注入到解析器的info参数中:
import { mergeSchemas } from 'graphql-tools'; const mergedSchema = mergeSchemas({ schemas: [yourLocalSchema, yourRemoteSchema], resolvers: { Query: { yourCustomField: (parent, args, ctx, info) => { return info.mergeInfo.delegateSchema({ schema: yourRemoteSchema, operation: 'query', fieldName: 'remoteField', args, context: ctx, info, }); }, }, }, });
如果只是手动定义Schema和解析器,没有经过mergeSchemas处理,info里自然不会有mergeInfo属性。
3. 关于官方文档的疑问
确实存在文档过时的可能性,因为Schema Stitching已经不是Apollo主推的方案了,现在官方更推荐使用Schema Federation来实现服务间的Schema组合。如果是查看的旧版Stitching文档,就会和当前的库版本不匹配。
内容的提问来源于stack exchange,提问作者Saraband
相关产品推荐
相关产品推荐

