Nestjs教程构建实时通信系统

最近在学习Nestjs框架,想用它构建一个实时通信系统,但遇到几个问题想请教大家:

  1. 在Nestjs中集成WebSocket时,选择Socket.io还是原生WS模块更合适?两者在性能和易用性上有什么区别?
  2. 实时消息的广播和私聊功能应该如何设计,有没有推荐的项目结构或设计模式?
  3. 如何保证消息的可靠传递,比如客户端断线重连后的消息补发机制该怎么实现?
  4. 需要做用户在线状态管理的话,在Nestjs中有什么优雅的实现方案?
    有没有实际做过类似项目的大佬能分享下经验?或者推荐一些开源参考案例?
3 回复

好的!以下是一个简要的NestJS构建实时通信系统的步骤:

  1. 初始化项目:npm i -g [@nestjs](/user/nestjs)/cli,然后运行nest new real-time-app

  2. 安装依赖:安装WebSocket库[@nestjs](/user/nestjs)/websockets和Socket.IOsocket.io

    npm install [@nestjs](/user/nestjs)/websockets socket.io
    
  3. 创建模块和控制器:

    nest generate module chat
    nest generate controller chat --no-spec
    
  4. chat.controller.ts中设置WebSocket连接:

    import { Controller, OnModuleInit } from '[@nestjs](/user/nestjs)/common';
    import { Server, Socket } from 'socket.io';
    
    [@Controller](/user/Controller)('chat')
    export class ChatController implements OnModuleInit {
      server: Server;
    
      constructor() {}
    
      onModuleInit() {
        this.server = new Server();
        this.server.on('connection', (socket: Socket) => {
          console.log(`User connected: ${socket.id}`);
          socket.on('message', (data) => {
            this.server.emit('response', data);
          });
        });
      }
    }
    
  5. 配置WebSocket: 在app.module.ts中添加WebSocketModule

    import { Module } from '[@nestjs](/user/nestjs)/common';
    import { AppController } from './app.controller';
    import { AppService } from './app.service';
    import { WebSocketModule } from '[@nestjs](/user/nestjs)/websockets';
    
    [@Module](/user/Module)({
      imports: [WebSocketModule],
      controllers: [AppController],
      providers: [AppService],
    })
    export class AppModule {}
    
  6. 启动服务:在main.ts中启动WebSocket服务器:

    import { NestFactory } from '[@nestjs](/user/nestjs)/core';
    import { AppModule } from './app.module';
    import { Server } from 'socket.io';
    
    async function bootstrap() {
      const app = await NestFactory.create(AppModule);
      const server = app.getHttpAdapter().getInstance();
    
      const io = new Server(server);
      io.on('connection', (socket) => {
        console.log('New client connected');
        socket.on('disconnect', () => console.log('Client disconnected'));
      });
    
      await app.listen(3000);
    }
    bootstrap();
    

完成以上步骤后,你可以通过Socket.IO客户端连接并进行实时通信。


  1. 安装依赖:首先初始化项目并安装必要的包,如@nestjs/common@nestjs/core等核心模块,以及WebSocket相关库@nestjs/websockets和Socket.IO

  2. 配置WebSocket:在main.ts中引入WsAdapter并绑定到应用实例上,启用WebSocket支持。

  3. 创建模块与服务

    • 使用nest g module chat生成聊天模块。
    • 在该模块下创建chat.service.ts处理业务逻辑,如消息存储与广播。
  4. 定义Gateway

    • 创建chat.gateway.ts文件,继承WebSocketGateway类。
    • 编写handleConnectionhandleDisconnect方法管理连接。
    • 定义事件处理器(如@SubscribeMessage('sendMsg'))接收客户端发来的消息,并调用emit向其他客户端推送消息。
  5. 前端实现

    • 使用HTML+JavaScript结合Socket.IO客户端API连接服务器,监听及发送消息。
  6. 测试运行:启动NestJS服务后,在浏览器打开多个窗口模拟多人聊天环境,验证实时通信效果。

  7. 优化与扩展:可以增加用户认证、历史消息查询等功能。同时注意性能优化,比如限流或使用数据库持久化聊天记录。

NestJS构建实时通信系统教程

NestJS非常适合构建实时通信系统,主要可以通过WebSocket或Socket.io实现。下面是一个基础实现方案:

1. 安装必要依赖

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

2. 创建WebSocket网关

// 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: any): void {
    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. 在AppModule中导入

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

@Module({
  imports: [ChatModule],
})
export class AppModule {}

5. 客户端连接示例

// 前端代码
const socket = io('http://localhost:3000');

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

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

进阶功能

  1. 房间功能
@SubscribeMessage('joinRoom')
handleJoinRoom(client: Socket, room: string): void {
  client.join(room);
}

@SubscribeMessage('roomMessage')
handleRoomMessage(client: Socket, payload: { room: string; message: string }): void {
  this.server.to(payload.room).emit('roomMessage', payload.message);
}
  1. 身份验证: 可以使用中间件进行WebSocket连接的身份验证。

  2. 消息持久化: 可以结合TypeORM将消息保存到数据库。

需要更详细的功能实现或者对某个部分有疑问,可以告诉我具体需求。

回到顶部