在使用NestJS实现WebSocket实时通讯时,如何正确处理客户端断开连接的事件?

在使用NestJS实现WebSocket实时通讯时,如何正确处理客户端断开连接的事件?我在@WebSocketGateway中尝试了handleDisconnect回调,但有时无法准确触发。同时想了解如何优雅地实现房间分组功能,比如不同频道的消息隔离,以及如何结合JWT对连接进行鉴权?官方文档对心跳机制和断线重连的实践写得比较简略,有没有完整的生产级代码示例可以参考?另外,当需要横向扩展多实例时,Socket.IO的适配器配置和Redis pub/sub应该如何整合到NestJS中?

3 回复

在NestJS中实现WebSocket实时通讯非常方便。首先确保安装@nestjs/websocketssocket.io依赖。

  1. 创建模块并引入WebSocketGateway:
nest g gateway chat
  1. chat.gateway.ts中配置WebSocket:
import { WebSocketGateway, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';

@WebSocketGateway()
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
  handleConnection(client: Socket) {
    console.log(`Client connected: ${client.id}`);
  }

  handleDisconnect(client: Socket) {
    console.log(`Client disconnected: ${client.id}`);
  }
}
  1. 定义事件处理逻辑。例如,广播消息:
@WebSocketGateway()
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
  @SubscribeMessage('msgToServer')
  handleMessage(client: Socket, payload: any): string {
    this.server.emit('msgToClient', `Hello, ${payload.name}!`);
    return 'Message received!';
  }
}
  1. 启动应用后,客户端可通过Socket.IO连接到服务器,并触发msgToServer事件。

注意:需要在main.ts中启用WebSocket支持:

const app = await NestFactory.create(AppModule);
app.useWebSocketAdapter(new Server({ /* 配置 */ }));
await app.listen(3000);

这样就完成了基本的WebSocket实时通讯功能!


在NestJS中实现WebSocket实时通讯非常简单。首先,安装必要的依赖:

npm install @nestjs/websockets socket.io

创建一个WebSocket服务:

// src/app.module.ts
import { Module } from '@nestjs/common';
import { AppGateway } from './app.gateway';

@Module({
  providers: [AppGateway],
})
export class AppModule {}
// src/app.gateway.ts
import { WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';

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

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

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

  sendMessageToClient(clientId: string, message: string) {
    this.server.to(clientId).emit('message', message);
  }
}

启动应用后,你可以通过/ws路径连接WebSocket。客户端可以使用如下代码连接:

const socket = io('http://localhost:3000/ws');
socket.on('connect', () => {
  console.log('Connected to server');
});
socket.on('message', (msg) => {
  console.log('Received:', msg);
});

这样就实现了基本的WebSocket通信功能。

NestJS WebSocket 实时通讯教程

WebSocket 是 NestJS 中实现实时双向通讯的强大工具。以下是一个简单的实现步骤:

1. 安装依赖

首先需要安装 WebSocket 模块:

npm install @nestjs/websockets @nestjs/platform-socket.io

2. 创建 WebSocket 网关

// src/chat/chat.gateway.ts
import { WebSocketGateway, WebSocketServer, SubscribeMessage, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';

@WebSocketGateway({
  cors: {
    origin: '*', // 允许所有来源,生产环境应配置具体域名
  },
})
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
  @WebSocketServer() server: Server;
  
  handleConnection(client: Socket) {
    console.log(`Client connected: ${client.id}`);
  }

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

  @SubscribeMessage('message')
  handleMessage(client: Socket, payload: any): void {
    console.log(`Received message: ${payload}`);
    this.server.emit('message', payload); // 广播给所有客户端
  }
}

3. 注册网关模块

// src/chat/chat.module.ts
import { Module } from '@nestjs/common';
import { ChatGateway } from './chat.gateway';

@Module({
  providers: [ChatGateway],
})
export class ChatModule {}

4. 前端连接示例

// 前端代码
const socket = io('http://your-nestjs-server-url');

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

// 发送消息
socket.emit('message', 'Hello from client!');

进阶功能

  1. 房间功能:使用 client.join('roomName')this.server.to('roomName').emit()
  2. 身份验证:通过握手时的查询参数或头信息进行验证
  3. 状态管理:使用 Redis 适配器实现多实例状态同步

记得在生产环境中配置更严格的安全策略,如 CORS 限制、身份验证等。

回到顶部