Nestjs实时通信功能实现与Socket.IO集成

在NestJS中集成Socket.IO实现实时通信时遇到几个问题:

  1. 如何正确配置Socket.IO模块与NestJS适配?官方文档的@nestjs/websockets和socket.io组合使用方式不太清晰;
  2. 多个命名空间(Namespace)情况下如何高效管理事件监听和发射?当前代码存在大量重复的on/emit逻辑;
  3. 与现有HTTP接口共存的认证方案如何统一?尝试用JWT中间件但WebSocket握手阶段无法共享守卫(Guard);
  4. 生产环境部署时遇到Nginx反向代理的WebSocket连接不稳定问题,是否需要特殊配置?希望能得到具体代码示例和架构设计建议。

3 回复

要在NestJS中实现WebSocket实时通信并集成Socket.IO,首先安装必要的依赖:

npm install [@nestjs](/user/nestjs)/websockets socket.io
  1. 创建模块:生成一个WebSocket模块

    nest g module gateway
    
  2. 创建Gateway:使用[@WebSocketGateway](/user/WebSocketGateway)()装饰器创建一个网关

    import { WebSocketGateway, WebSocketServer } from '[@nestjs](/user/nestjs)/websockets';
    import { Server, Socket } from 'socket.io';
    
    [@WebSocketGateway](/user/WebSocketGateway)()
    export class ChatGateway {
      @WebSocketServer() server: Server;
    
      handleConnection(client: Socket) {
        console.log(`Client connected: ${client.id}`);
      }
    
      handleDisconnect(client: Socket) {
        console.log(`Client disconnected: ${client.id}`);
      }
    
      sendMessage(client: Socket, message: string) {
        this.server.emit('newMessage', message);
      }
    }
    
  3. 注册到模块:在模块文件中导入并注册网关

    import { Module } from '[@nestjs](/user/nestjs)/common';
    import { ChatGateway } from './chat.gateway';
    
    [@Module](/user/Module)({
      providers: [ChatGateway],
    })
    export class GatewayModule {}
    
  4. 客户端连接:前端可以使用Socket.IO客户端库连接到服务器。

通过以上步骤,你可以轻松地在NestJS中实现WebSocket实时通信。


要在NestJS中实现实时通信功能并集成Socket.IO,首先确保安装必要的依赖:

npm install @nestjs/websockets socket.io
  1. 创建WebSocket Gateway:使用@nestjs/cli生成WebSocket服务端点。
npm run g gateway <gateway-name>
  1. 配置Gateway:在生成的<gateway-name>.ts文件中,通过@WebSocketGateway()装饰器启用WebSocket功能。
import { WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';

@WebSocketGateway()
export class ChatGateway {
  @WebSocketServer() server: Server;

  handleConnection(client: Socket) {
    console.log(`Client connected: ${client.id}`);
  }

  handleDisconnect(client: Socket) {
    console.log(`Client disconnected: ${client.id}`);
  }

  // 自定义事件处理
  handleEvent(client: Socket, data: any) {
    this.server.emit('event', { ...data, time: new Date() });
  }
}
  1. 绑定路由:在模块中注册WebSocketGateway。
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ChatGateway } from './chat.gateway';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService, ChatGateway],
})
export class AppModule {}
  1. 客户端连接:前端可以使用Socket.IO客户端库连接到服务器。
const socket = io('http://localhost:3000');
socket.on('connect', () => {
  console.log('Connected to server');
});
socket.on('event', (data) => {
  console.log(data);
});
socket.emit('event', { message: 'Hello Server' });

这样就完成了NestJS与Socket.IO的基本集成。

在NestJS中集成Socket.IO实现实时通信的步骤如下:

  1. 安装依赖:
npm install @nestjs/websockets @nestjs/platform-socket.io socket.io
  1. 创建Gateway (相当于Socket.IO服务器):
// src/chat/chat.gateway.ts
import { SubscribeMessage, WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';

@WebSocketGateway({
  cors: {
    origin: '*', // 生产环境应限制具体域名
  }
})
export class ChatGateway {
  @WebSocketServer()
  server: Server;

  @SubscribeMessage('message')
  handleMessage(client: Socket, payload: string): void {
    this.server.emit('message', payload); // 广播给所有客户端
  }
}
  1. 在模块中注册:
// src/chat/chat.module.ts
import { Module } from '@nestjs/common';
import { ChatGateway } from './chat.gateway';

@Module({
  providers: [ChatGateway]
})
export class ChatModule {}
  1. 客户端连接 (前端示例):
import io from 'socket.io-client';

const socket = io('http://your-nest-server-url');

// 发送消息
socket.emit('message', 'Hello World');

// 接收消息
socket.on('message', (data) => {
  console.log('Received:', data);
});

关键点:

  • 使用@WebSocketGateway装饰器创建WebSocket服务
  • @WebSocketServer提供Socket.IO服务器实例
  • @SubscribeMessage处理特定事件
  • 可通过this.server.emit广播或client.emit单独发送

进阶功能可以加入:

  • 房间管理
  • 用户认证
  • 消息持久化
  • 异常处理
回到顶部