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

前言

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

什么是发布订阅模式

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

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

发布订阅模块的优点

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

发布订阅模块使用步骤

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

一、安装 @nestjs/event-emitter

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

npm install @nestjs/event-emitter

二、根模块导入 EventEmitterModule 模块

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

import { Module } from '@nestjs/common';
import { EventEmitterModule } from '@nestjs/event-emitter';

@Module({
  imports: [EventEmitterModule.forRoot()],
})
export class AppModule {}

三、定义自定义事件

定义一个事件,例如 UserCreatedEvent

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

四、创建事件发布者

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

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

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 实现了发布订阅的流程,这将帮助你构建灵活的、可扩展的和耦合度低的应用。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐闻x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值