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

