nestjs 使用 socket.io 管理连接、处理事件、广播消息
时间: 2024-09-13 16:06:21 浏览: 51
NestJS 是一个用于构建高效、可靠和可扩展的服务器端应用程序的框架。它使用 TypeScript 编写,但也兼容纯 JavaScript。NestJS 内置了对 WebSocket 的支持,并且可以通过集成 socket.io 来管理连接、处理事件和广播消息。
以下是使用 socket.io 在 NestJS 中管理连接、处理事件和广播消息的基本步骤:
1. 安装依赖:首先需要安装 NestJS 和 socket.io 相关的依赖包。
```bash
npm install @nestjs/websockets @nestjs/platform-express socket.io
```
2. 创建 WebSocket 模块:使用 NestJS 提供的装饰器和模块创建一个 WebSocket 模块。
```typescript
// socket.module.ts
import { Module } from '@nestjs/common';
import { WebsocketsModule } from '@nestjs/websockets';
import { SocketModule } from '@nestjs/platform-express';
@Module({
imports: [
WebsocketsModule.register(),
SocketModule,
],
})
export class AppModule {}
```
3. 创建 Socket 守护者(Guard)或拦截器(Interceptor):根据需要,你可能想要创建一个守卫或拦截器来处理验证、授权等逻辑。
```typescript
// socket.guard.ts
import { Injectable } from '@nestjs/common';
import { CanActivate, ExecutionContext } from '@nestjs/common';
import { Socket } from 'socket.io';
@Injectable()
export class SocketGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
const ctx = context.switchToHttp();
const req = ctx.getRequest<Socket>();
// 在这里添加你的验证逻辑
return true; // 或者根据验证结果返回 false
}
}
```
4. 创建 Socket 控制器:创建一个 Socket 控制器来处理客户端事件和发送消息。
```typescript
// socket.controller.ts
import { Controller, OnModuleInit, OnModule销毁, EmitEvent, OnEvent, socket } from '@nestjs/websockets';
import { Socket as IoSocket } from 'socket.io';
@Controller('socket')
export class SocketController implements OnModuleInit, OnModule销毁 {
@OnModuleInit()
onModuleInit(client: IoSocket) {
// 初始化时的操作,例如连接的统计、初始化数据广播等
}
@OnModule销毁()
onModule销毁(client: IoSocket) {
// 模块销毁时的操作
}
@EmitEvent('userConnected')
handleUserConnected(data: any) {
// 当客户端触发 userConnected 事件时调用
return data;
}
@OnEvent('connection')
handleConnection(client: IoSocket) {
// 当客户端连接时的操作
}
@OnEvent('disconnect')
handleDisconnect(client: IoSocket) {
// 当客户端断开连接时的操作
}
}
```
5. 使用装饰器来注册事件处理器:`@EmitEvent`、`@OnEvent` 等装饰器用于注册对应的事件处理函数。
6. 在主模块中导入 WebSocket 模块:确保你的 WebSocket 模块在主模块中被导入。
```typescript
// app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppModule } from './app.module';
import { SocketModule } from './socket.module';
@Module({
imports: [AppModule, SocketModule],
controllers: [AppController],
})
export class AppModule {}
```
现在,你的 NestJS 应用已经可以使用 socket.io 来管理连接、处理事件和广播消息了。
阅读全文