NestJS中GraphQLModule的context内req为undefined问题求助
解决NestJS GraphQLModule中Context无法获取req的问题
我之前也踩过完全一样的坑,折腾了好几个小时才搞明白,给你梳理几个最可能的原因和对应的解决方案:
1. 先区分你的请求类型:HTTP(Query/Mutation)还是WebSocket订阅?
你开启了installSubscriptionHandlers: true,这时候要注意两种请求的Context参数差异:
- HTTP请求(Query/Mutation):Context函数的参数里是
{ req, res }(默认Express环境)或者{ request, reply }(Fastify环境) - WebSocket订阅请求:Context函数的参数里是
{ connection },此时直接拿req会是undefined,得从connection.context里取请求信息
先修改你的Context函数,兼容两种请求场景:
context: ({ req, connection }) => { // 处理订阅请求 if (connection) { // 从WebSocket握手的升级请求中获取req const subscriptionReq = connection.context.req || connection.context.request; console.log('订阅请求的req:', subscriptionReq); return { req: subscriptionReq }; } // 处理HTTP请求 console.log('HTTP请求的req:', req); return { req }; }
如果涉及订阅场景,还需要在GraphQL配置里添加subscriptions选项,确保握手时把请求对象传入Context:
GraphQLModule.forRoot({ // 其他已有配置... installSubscriptionHandlers: true, subscriptions: { 'subscriptions-transport-ws': { onConnect: (connectionParams, webSocket) => { // 从WebSocket的升级请求中提取req return { req: webSocket.upgradeReq }; }, }, }, context: ({ req, connection }) => { // 上面的兼容逻辑 }, })
2. 检查你使用的HTTP框架(Express/Fastify)
如果你的项目用的是Fastify而非默认的Express,Context函数里的请求参数不是req,而是request!需要改成:
context: ({ request }) => { console.log(request); // Fastify环境下的请求对象 return { req: request }; }
可以去main.ts里确认:如果是NestFactory.create(AppModule)就是默认Express;如果是NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter())就是Fastify环境。
3. 检查中间件的加载与执行逻辑
如果你的AuthModule或其他自定义中间件在处理请求时,没有正确传递请求对象,也可能导致req丢失。比如用passport做认证时,要确保中间件正确应用到了GraphQL的默认路由(/graphql)上。
另外,NestJS模块的导入顺序不影响中间件执行顺序,中间件是通过app.use()或模块的configure方法注册的,要确认没有中间件拦截请求后未传递req。
先试试上面的方案,尤其是区分请求类型和HTTP框架的点,大概率能解决你req为undefined的问题。
内容的提问来源于stack exchange,提问作者Shamim
相关产品推荐
相关产品推荐

