如何在Nest.js中仅通过WebSockets处理所有GraphQL查询与变更?
配置Nest.js使所有GraphQL查询与变更通过WebSockets处理
1. 安装必要依赖
先安装Nest.js GraphQL核心包及WebSocket订阅相关依赖:
npm install @nestjs/graphql @nestjs/apollo graphql apollo-server-express graphql-subscriptions subscriptions-transport-ws graphql-ws # 或用yarn yarn add @nestjs/graphql @nestjs/apollo graphql apollo-server-express graphql-subscriptions subscriptions-transport-ws graphql-ws
2. 配置GraphQL模块(禁用HTTP端点)
在AppModule中配置GraphQL模块,完全禁用HTTP端点,强制所有GraphQL操作(查询、变更、订阅)仅通过WebSocket处理:
import { Module } from '@nestjs/common'; import { GraphQLModule } from '@nestjs/graphql'; import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'; import { join } from 'path'; @Module({ imports: [ GraphQLModule.forRoot<ApolloDriverConfig>({ driver: ApolloDriver, // 自动生成Schema文件(可自定义路径) autoSchemaFile: join(process.cwd(), 'src/schema.gql'), // 核心配置:禁用HTTP GraphQL端点 skipHttp: true, // 配置WebSocket传输 subscriptions: { 'graphql-ws': { // WebSocket访问路径,需与客户端保持一致 path: '/graphql', // 处理WebSocket连接时的上下文(比如认证逻辑) onConnect: (context) => { const { connectionParams } = context; // 示例:从连接参数中提取并验证认证令牌 const authToken = connectionParams?.authorization?.replace('Bearer ', ''); const user = authToken ? validateAuthToken(authToken) : null; return { user }; }, }, }, // 可选:配置Playground调试工具(指向WebSocket端点) playground: { endpoint: '/graphql', subscriptionEndpoint: 'ws://localhost:3000/graphql', }, }), ], }) export class AppModule {}
3. 客户端配置(通过WebSocket发送所有操作)
客户端需用WebSocket链接替代HTTP链接,确保查询和变更也走WebSocket通道。以Apollo Client为例:
import { ApolloClient, InMemoryCache } from '@apollo/client'; import { GraphQLWsLink } from '@apollo/client/link/subscriptions'; import { createClient } from 'graphql-ws'; // 创建WebSocket链接 const wsLink = new GraphQLWsLink(createClient({ url: 'ws://localhost:3000/graphql', // 可选:连接时携带认证参数 connectionParams: { authorization: 'Bearer YOUR_AUTH_TOKEN', }, })); // 初始化Apollo Client const client = new ApolloClient({ link: wsLink, cache: new InMemoryCache(), });
关键注意事项
skipHttp: true是核心配置,会彻底关闭Nest.js的HTTP GraphQL端点,所有请求必须通过WebSocket发送。onConnect方法用于处理WebSocket连接上下文,比如用户认证,参数需从connectionParams中获取,而非HTTP请求头。- 若使用Playground调试,必须配置
subscriptionEndpoint指向WebSocket地址,否则无法发送查询/变更请求。
内容的提问来源于stack exchange,提问作者rajepep922
相关产品推荐
相关产品推荐

