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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:02:37