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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:54:16