NestJSWebSocket实时应用
如何在NestJS中实现WebSocket的实时通讯功能?我正在开发一个需要实时数据更新的应用,听说NestJS支持WebSocket,但不太清楚具体实现步骤。有没有完整的示例代码展示如何搭建WebSocket服务器、处理客户端连接和消息推送?另外,如何与现有的HTTP服务共存,以及如何处理身份验证和房间分组这类高级功能?最好能解释下Gateway、SubscribeMessage这些装饰器的具体用法。
作为一个屌丝程序员,我觉得NestJS的WebSocket功能确实好用。首先,你需要安装@nestjs/websockets
和socket.io
依赖。然后创建一个Gateway类,继承自WebSocketGateway
。
在Gateway里,你可以定义事件处理器,比如handleConnection
和handleDisconnect
来管理连接。使用@SubscribeMessage
装饰器可以监听客户端发送的消息。
举个例子,创建一个简单的聊天室:
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}`);
}
@SubscribeMessage('chat message')
handleMessage(client: Socket, payload: { text: string }) {
this.server.emit('chat message', payload);
}
}
这样客户端就可以实时收发消息了。屌丝如我用这个功能开发即时通讯应用,简直不要太爽!
NestJS提供了强大的WebSocket支持,基于Socket.IO实现。首先安装依赖:npm install --save @nestjs/websockets socket.io
。然后创建一个WebSocketGateway:
import { WebSocketGateway, WebSocketServer } from '@nestjs/websockets';
import { Server } from 'socket.io';
@WebSocketGateway()
export class ChatGateway {
@WebSocketServer() server: Server;
handleConnection(client: any) {
console.log(`Client connected: ${client.id}`);
}
handleDisconnect(client: any) {
console.log(`Client disconnected: ${client.id}`);
}
sendMessage(client: any, data: any) {
this.server.emit('message', data);
}
}
客户端连接后,可以通过this.server.emit
广播消息。可以在主模块中启用它:
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 {}
这样就完成了一个简单的WebSocket实时通信应用,适合聊天、通知等场景。
NestJS WebSocket 实时应用开发指南
NestJS提供了强大的WebSocket支持,可以通过@nestjs/websockets
模块轻松构建实时应用。以下是开发WebSocket实时应用的基本方法:
基本实现步骤
- 安装依赖
npm install @nestjs/websockets socket.io
- 创建网关(Gateway)
import { WebSocketGateway, SubscribeMessage, MessageBody } from '@nestjs/websockets';
import { Socket } from 'socket.io';
@WebSocketGateway()
export class EventsGateway {
@SubscribeMessage('message')
handleMessage(@MessageBody() data: string): string {
return `Server received: ${data}`;
}
afterInit(server: any) {
console.log('WebSocket Gateway initialized');
}
handleConnection(client: Socket) {
console.log(`Client connected: ${client.id}`);
}
handleDisconnect(client: Socket) {
console.log(`Client disconnected: ${client.id}`);
}
}
- 注册网关模块
import { Module } from '@nestjs/common';
import { EventsGateway } from './events.gateway';
@Module({
providers: [EventsGateway]
})
export class EventsModule {}
进阶功能
- 房间支持
@SubscribeMessage('joinRoom')
handleJoinRoom(client: Socket, room: string) {
client.join(room);
client.emit('joinedRoom', room);
}
@SubscribeMessage('leaveRoom')
handleLeaveRoom(client: Socket, room: string) {
client.leave(room);
client.emit('leftRoom', room);
}
- 广播消息
@SubscribeMessage('sendToRoom')
handleSendToRoom(client: Socket, payload: { room: string; message: string }) {
client.to(payload.room).emit('message', payload.message);
}
- 认证与中间件
@WebSocketGateway({
middleware: [
(socket: Socket, next) => {
// 认证逻辑
if (socket.handshake.query.token === 'valid') {
return next();
}
return next(new Error('Authentication error'));
}
]
})
客户端连接示例
// 前端JS
const socket = io('http://localhost:3000');
socket.on('connect', () => {
console.log('Connected to server');
});
socket.emit('message', 'Hello from client');
socket.on('message', (data) => {
console.log('Received:', data);
});
NestJS WebSocket提供了完整的实时通信解决方案,支持房间、广播、中间件等特性,非常适合构建聊天应用、实时数据监控等场景。