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

NestJS GraphQL订阅resolve中Context为undefined的问题求助

解决NestJS GraphQL Subscription中Context为Undefined的问题

问题出在Subscription基于WebSocket协议,其上下文参数与HTTP请求(Query/Mutation)不同,你当前的context配置只处理了HTTP场景,没有适配WebSocket连接的情况。

解决方案步骤

1. 修改GraphQLModule的Context配置

更新context函数,同时处理HTTP请求和WebSocket连接两种场景:

@Module({
  imports: [
    GraphQLModule.forRoot<ApolloDriverConfig>({
      driver: ApolloDriver,
      playground: true,
      installSubscriptionHandlers: true,
      autoSchemaFile,
      // 配置CORS允许携带凭证(Cookie)
      cors: {
        origin: process.env.FRONTEND_URL || true, // 替换为你的前端域名
        credentials: true,
      },
      context: ({ req, res, connection }) => {
        // HTTP请求(Query/Mutation)场景
        if (req) {
          return { req, res };
        }
        // WebSocket订阅场景:从connection.context获取握手时的请求对象
        if (connection) {
          return { req: connection.context.req };
        }
        return {};
      },
    }),
    // ... 其他模块
  ],
  providers: [PrismaService]
})

2. (可选)手动配置WebSocket握手时的上下文

如果需要自定义WebSocket握手逻辑,可以添加subscriptions配置,在onConnect钩子中显式传递请求信息:

GraphQLModule.forRoot<ApolloDriverConfig>({
  // ... 其他配置
  subscriptions: {
    'subscriptions-transport-ws': {
      onConnect: (_, __, context) => {
        // 从握手上下文获取原始请求对象
        return { req: context.request };
      },
    },
  },
})

3. 验证Subscription中的Context

修改你的Subscription代码,确认context已正确传递:

@Subscription(() => ResponseObjectType, {
  resolve: (payload, _, context) => {
    console.log(context.req.cookies); // 现在可以访问Cookie了
    return payload;
  },
})
subscribeHere(@Context() ctx) {
  console.log(ctx.req.cookies); // 订阅触发时也能拿到Cookie
  return this.pubsub.asyncIterator('subscribeHere');
}

关键说明

  • WebSocket连接的上下文初始化发生在握手阶段,而非每次订阅消息推送时,所以Cookie信息会在握手时一次性传递到connection.context中。
  • 必须确保前端在建立WebSocket连接时携带credentials: true(比如Apollo Client的createHttpLink或createWebSocketLink中配置),否则Cookie不会被传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:25:17