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

NestJS中GraphQLModule上下文req为undefined问题求助

解决NestJS GraphQLModule中context无法获取req的问题

我之前也踩过一模一样的坑,给你几个实用的排查方向和解决办法:

1. 区分HTTP请求与WebSocket订阅的context参数差异

你开启了installSubscriptionHandlers: true,意味着同时支持普通HTTP请求和WebSocket订阅,这两种请求的context参数结构完全不同:

  • 普通Query/Mutation请求(HTTP)的context参数是{ req, res }
  • 订阅请求(WebSocket)的context参数是{ connection, payload }

如果你的测试请求是订阅类型,那req自然会是undefined。可以先测试一个普通的Query接口,看看req是否能正常获取。要是想兼容两种场景,context可以这么写:

context: ({ req, connection }) => {
  if (req) {
    console.log('HTTP请求的req:', req);
    return { req };
  } else if (connection) {
    console.log('WebSocket连接的上下文:', connection.context);
    return { ...connection.context };
  }
}

2. 确认底层框架的参数命名

如果你用的是Fastify而非默认的Express作为NestJS的底层HTTP框架,context里的请求对象不是req而是request,响应对象是reply,得改成对应的命名:

context: ({ request }) => {
  console.log(request);
  return { req: request };
}

3. 验证请求是否正常到达NestJS HTTP管道

可以先在AppController里加个简单的测试接口,确认req能被正常捕获:

import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';

@Controller()
export class AppController {
  @Get('/test-req')
  testReq(@Req() req: Request) {
    console.log('测试接口的req:', req);
    return '请求正常到达';
  }
}

如果这个接口能拿到req,那问题肯定出在GraphQL的配置上;如果这个也拿不到,就得检查HTTP服务器的基础配置(比如反向代理、端口映射之类的)。

4. 排查依赖版本兼容性

旧版本的@nestjs/graphql和apollo-server-express偶尔会有兼容性问题,导致req无法传递到context。可以尝试更新到最新稳定版:

npm update @nestjs/graphql @nestjs/apollo apollo-server-express

5. 检查自定义中间件或CORS的干扰

如果你的应用配置了自定义全局中间件或者CORS,可能会影响req的传递。可以暂时禁用CORS测试,或者调整中间件的加载顺序,确保GraphQL模块的配置在中间件之后生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:53:07