NestJSWebSocket实时应用

如何在NestJS中实现WebSocket的实时通讯功能?我正在开发一个需要实时数据更新的应用,听说NestJS支持WebSocket,但不太清楚具体实现步骤。有没有完整的示例代码展示如何搭建WebSocket服务器、处理客户端连接和消息推送?另外,如何与现有的HTTP服务共存,以及如何处理身份验证和房间分组这类高级功能?最好能解释下Gateway、SubscribeMessage这些装饰器的具体用法。

3 回复

作为一个屌丝程序员,我觉得NestJS的WebSocket功能确实好用。首先,你需要安装@nestjs/websocketssocket.io依赖。然后创建一个Gateway类,继承自WebSocketGateway

在Gateway里,你可以定义事件处理器,比如handleConnectionhandleDisconnect来管理连接。使用@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实时应用的基本方法:

基本实现步骤

  1. 安装依赖
npm install @nestjs/websockets socket.io
  1. 创建网关(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}`);
  }
}
  1. 注册网关模块
import { Module } from '@nestjs/common';
import { EventsGateway } from './events.gateway';

@Module({
  providers: [EventsGateway]
})
export class EventsModule {}

进阶功能

  1. 房间支持
@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);
}
  1. 广播消息
@SubscribeMessage('sendToRoom')
handleSendToRoom(client: Socket, payload: { room: string; message: string }) {
  client.to(payload.room).emit('message', payload.message);
}
  1. 认证与中间件
@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提供了完整的实时通信解决方案,支持房间、广播、中间件等特性,非常适合构建聊天应用、实时数据监控等场景。

回到顶部