升级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
相关产品推荐
相关产品推荐

