You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:33:33