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

升级Apollo v2至v3后RESTDataSource中context未定义问题排查

问题原因及解决方案

核心问题

从Apollo Server v2升级到v3后,你使用的@apollo/datasource-rest包(替代了v2的apollo-datasource-rest)对DataSource的上下文传递机制做了两处关键变更:

  • 不再自动将请求上下文绑定到this.context,需要手动通过initialize方法接收并保存
  • willSendRequest方法的参数签名发生变化,不再接收path作为第一个参数

修复步骤

1. 添加initialize方法保存上下文

在CustomAPI类中新增initialize方法,将Apollo Server传入的上下文赋值给this.context:

const {RESTDataSource} = require('@apollo/datasource-rest'),
config = require('config')

class CustomAPI extends RESTDataSource {
        constructor() {
            super();
            this.baseURL = `${config.customapi.url}/path/api`;
        }

        // 新增initialize方法,接收上下文配置
        initialize(config) {
            this.context = config.context;
        }

        // 修改willSendRequest的参数签名,仅保留request参数
        willSendRequest(request) {
            console.log("willSendRequest - this.context: ", this.context);
            request.headers.set('Authorization', this.context.user.token);
        }

        async getAccount() {
            return await this.get('account');
        }
        ...
}

2. 修正willSendRequest参数签名

v3版本的willSendRequest仅接收一个request参数,移除原来的path参数,避免参数不匹配导致的逻辑错误。

为什么升级前正常?

在Apollo Server v2中,旧版apollo-datasource-rest会自动将上下文绑定到this.context,且willSendRequest的参数签名是(path, request),因此你的代码无需额外处理就能正常工作。升级到v3后,官方推出了新的@apollo/datasource-rest包,重构了DataSource的实现逻辑,上述自动绑定和参数规则都发生了变化,导致原代码失效。

内容的提问来源于stack exchange,提问作者abeauchamp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:54:54