在使用NestJS实现WebSocket实时通讯时,如何正确处理客户端断开连接的事件?
在使用NestJS实现WebSocket实时通讯时,如何正确处理客户端断开连接的事件?我在@WebSocketGateway中尝试了handleDisconnect回调,但有时无法准确触发。同时想了解如何优雅地实现房间分组功能,比如不同频道的消息隔离,以及如何结合JWT对连接进行鉴权?官方文档对心跳机制和断线重连的实践写得比较简略,有没有完整的生产级代码示例可以参考?另外,当需要横向扩展多实例时,Socket.IO的适配器配置和Redis pub/sub应该如何整合到NestJS中?
3 回复
在NestJS中实现WebSocket实时通讯非常方便。首先确保安装@nestjs/websockets
和socket.io
依赖。
- 创建模块并引入WebSocketGateway:
nest g gateway chat
- 在
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}`);
}
}
- 定义事件处理逻辑。例如,广播消息:
@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!';
}
}
- 启动应用后,客户端可通过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!');
进阶功能
- 房间功能:使用
client.join('roomName')
和this.server.to('roomName').emit()
- 身份验证:通过握手时的查询参数或头信息进行验证
- 状态管理:使用 Redis 适配器实现多实例状态同步
记得在生产环境中配置更严格的安全策略,如 CORS 限制、身份验证等。