GraphQL Federation网关未转发子图自定义响应头问题及解决
问题描述
基于Node + Nest搭建的GraphQL API采用网关(Gateway)+子图(Subgraphs)架构,已完成请求头转发至子图的配置,但存在反向问题:网关会自动剥离子图返回的自定义响应头。
- 本地开发环境已复现该问题,排除生产基础设施因素;
- 直接调用生产环境子图时,自定义响应头可正常获取,因此确定问题出在网关配置层面。
解决方案
通过自定义RemoteGraphQLDataSource的didReceiveResponse钩子,将子图返回的自定义响应头同步到网关的响应中,代码如下:
gateway: { buildService: ({ name, url }) => { return new RemoteGraphQLDataSource({ url, didReceiveResponse({ response, context }) { // 从子图响应中获取自定义头(示例为traceid) const traceIdHeader = response?.http?.headers?.get('traceid'); if (traceIdHeader) { // 将自定义头设置到网关的响应对象中 (context?.req?.res as Response)?.setHeader('traceId', traceIdHeader); } return response; }, }); }, }
代码说明
buildService用于为每个子图创建自定义数据源服务;didReceiveResponse钩子在网关接收到子图响应后触发,可在此读取子图的响应头;- 通过
context.req.res获取网关的响应对象,将子图返回的自定义头同步到网关响应中,确保客户端能正常获取该头。
内容的提问来源于stack exchange,提问作者SebastianG
相关产品推荐
相关产品推荐

