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

