乐闻世界logo
第 8 / 24 篇

如何在 NestJS 项目中优雅的使用发布订阅工具 Event Emitter

第 8 / 24 篇
1 零基础入门 Nestjs 开发教程2基于Nestjs实现node发送邮件3一文教会你如何使用 Vercel 部署你的 NestJS 应用 4NestJS 如何进行服务端推送SSE、自定义服务端推送内容5如何在 NestJS 中集成 MongoDB 并实现数据的增删改查操作6如何在 NestJS 中集成 Redis 并基于 Redis 实现接口访问限频率7基于 NestJS 集成 ElasticSearch 实现模糊搜索功能8如何在 NestJS 项目中优雅的使用发布订阅工具 Event Emitter9一篇文章学会使用 NestJS 的 Module 实现高效的代码模块管理10一篇文章学会如何使用 NestJS 的五种 Provider 提供者11 一篇文章学会如何使用 NestJS 的 管道Pipes 实现高效的数据转换和验证12基于 NestJS 操作 TypeORM 中的多对多 ManyToMany13基于 NestJS 操作 TypeORM 中的一对多 OneToMany14一篇文章学会如何使用 NestJS 的 Guards 守卫实现系统身份验证和授权15一篇文章学会 NestJS 中间件的使用,让你的应用更灵活和可扩展16一篇文章学会如何使用 NestJS 过滤器处理全局异常情况17一篇文章学会 NestJS 的拦截器并且附带实战操作案例18NestJS 如何实现接口多版本控制19如何在 NestJS 中安全高效的管理 Config 配置20一篇文章掌握 NestJS 所有的生命周期以及执行时机21如何在 Nest 项目中自定义装饰器22NestJS 基于 Passort 和 JWT Token 实现接口的权限管理23基于NestJS 和 TypeORM 实现 CURD RESTful API接口24探索 @nestjs/cqrs:在 NestJS 中实现命令查询责任分离模式CQRS
返回教程主页

如何在 NestJS 项目中优雅的使用发布订阅工具 Event Emitter

在构建复杂的应用时,异步处理和解耦成为了关键所在,而发布订阅模式正好可以辅助实现这两点。在这篇文章中,我们将详细介绍在使用NestJS进行Web开发时,如何利用@nestjs/event-emitter包进行发布订阅模式的实现。什么是发布订阅模式发布订阅模式是一种广泛使用的消息传递方式,发布者发布消息,订阅者订阅关注的消息,然后接收这些消息。发布者和订阅者之间不存在直接联系,它们通过消息队列或者主

前言

在构建复杂的应用时,异步处理和解耦成为了关键所在,而发布订阅模式正好可以辅助实现这两点。在这篇文章中,我们将详细介绍在使用 NestJS 进行 Web 开发时,如何利用 @nestjs/event-emitter 包进行发布订阅模式的实现。

什么是发布订阅模式

发布订阅模式是一种广泛使用的消息传递方式,发布者发布消息,订阅者订阅关注的消息,然后接收这些消息。

发布者和订阅者之间不存在直接联系,它们通过消息队列或者主题进行通讯。这种模式能够确保系统的解耦,异步处理以及消息的广播。

发布订阅模块的优点

  1. 解耦:发布者和订阅者之间的解耦可以让我们的应用组件更独立,更加容易扩展和维护。
  2. 异步处理:发布订阅模式可以让我们的应用异步处理事件,这很重要,特别是在处理需要大量时间的任务时。
  3. 广播:我们可以向所有的订阅者广播消息,无需逐一发送。

发布订阅模块使用步骤

下面是如何在应用中使用 @nestjs/event-emitter 进行事件发布和订阅。

一、安装 @nestjs/event-emitter

首先需要安装 @nestjs/event-emitter 包。

shell
npm install @nestjs/event-emitter

二、根模块导入 EventEmitterModule 模块

在你的应用模块,例如 AppModule 中引入 EventEmitterModule

typescript
import { Module } from '@nestjs/common'; import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [EventEmitterModule.forRoot()], }) export class AppModule {}

三、定义自定义事件

定义一个事件,例如 UserCreatedEvent

typescript
export class UserCreatedEvent { constructor( public readonly userId: number, public readonly userName: string ) {} }

四、创建事件发布者

在服务中发布事件,例如在 UsersService 中:

typescript
import { EventEmitter2 } from '@nestjs/event-emitter'; import { Injectable } from '@nestjs/common'; import { UserCreatedEvent } from './user-created.event'; @Injectable() export class UsersService { constructor(private eventEmitter: EventEmitter2) {} async create(userId: number, userName: string) { // Some business logic this.eventEmitter.emit('user.created', new UserCreatedEvent(userId, userName)); } }

在这个例子中,当用户创建后,我们发布一个 'user.created' 事件。

五、创建事件订阅者

创建一个订阅者来监听 'user.created' 事件,例如创建一个 UserCreatedListener

typescript
import { OnEvent } from '@nestjs/event-emitter'; import { Injectable } from '@nestjs/common'; import { UserCreatedEvent } from './user-created.event'; @Injectable() export class UserCreatedListener { @OnEvent('user.created') handleUserCreatedEvent(event: UserCreatedEvent) { console.log(event.userId, event.userName); } }

在这个例子中,当 user.created 事件被触发时,handleUserCreatedEvent 函数会被执行,并打印出事件的参数。确保在 EventEmitterModule.forRoot()UserCreatedListener 已经被导入到模块中。

总结

通过以上步骤,你已经成功在 NestJS 应用中使用 @nestjs/event-emitter 实现了发布订阅的流程,这将帮助你构建灵活的、可扩展的和耦合度低的应用。