Nest.js 实战 (十二):优雅地使用事件发布/订阅模块 Event Emitter

简介: 这篇文章介绍了在Nest.js构建应用时,如何通过事件/发布-订阅模式使应用程序更健壮、灵活、易于扩展,并简化服务间通信。文章主要围绕@nestjs/event-emitter模块展开,这是一个基于eventemitter2库的社区模块,提供了事件发布/订阅功能,使得实现事件驱动架构变得简单。文章还介绍了如何使用该模块,包括安装依赖、初始化模块、注册EventEmitterModule、使用装饰器简化监听等。最后总结,集成@nestjs/event-emitter模块可以提升应用程序的事件驱动能力,构建出更为松耦合、易扩展且高度灵活的系统架构,是构建现代、响应迅速且具有高度解耦特性的Nest.

前言

在使用 Nest.js 构建应用时,特别是对于构建复杂、高并发、分布式的现代 Web 应用程序,事件/发布-订阅模式可以使应用程序更加健壮、灵活和易于扩展,同时还能简化服务间的通信。

本篇文章将详细介绍 @nestjs/event-emitterNest.js 应用如何使用。

@nestjs/event-emitter 是什么?

@nestjs/event-emitter 是一个 Nest.js 的社区模块,基于强大的 eventemitter2 库,它提供了事件发布/订阅的功能,使得在 Nest.js 应用程序中实现事件驱动架构变得简单。通过使用这个模块,你可以轻松地在服务之间发送事件,并监听这些事件来触发某些行为。

具体使用

1、 安装依赖

pnpm add @nestjs/event-emitter

2、 初始化模块
在主模块 AppModule 中,导入 EventEmitterModule 并注册它

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

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

3、 发布事件
需要在你的服务中注入 EventEmitter 服务,然后可以使用 emit 方法来发布事件

import {
    Injectable, Inject } from '@nestjs/common';
import {
    EventEmitter2 } from '@nestjs/event-emitter';

@Injectable()
export class MyService {
   
  constructor(
    @Inject(EventEmitter2)
    private readonly eventEmitter: EventEmitter2,
  ) {
   }

  publishEvent() {
   
    this.eventEmitter.emit('my-event', {
    message: 'Hello from service!' });
  }
}

4、 订阅事件
我们在另一个服务中使用 on 方法订阅发布的事件

import {
    Injectable, Inject } from '@nestjs/common';
import {
    EventEmitter2 } from '@nestjs/event-emitter';

@Injectable()
export class ListenerService {
   
  constructor(
    @Inject(EventEmitter2)
    private readonly eventEmitter: EventEmitter2,
  ) {
   
    this.eventEmitter.on('my-event', this.handleEvent);
  }

  private handleEvent(data: any) {
   
    console.log('Received data:', data);
  }
}

5、 使用装饰器简化监听
如果你不想在构造函数中手动绑定事件监听器,可以使用 @OnEvent 装饰器来简化这一过程

import {
    Injectable } from '@nestjs/common';
import {
    OnEvent } from '@nestjs/event-emitter';

@Injectable()
export class ListenerService {
   
  @OnEvent('my-event')
  handleEvent(data: any) {
   
    console.log('Received data:', data);
  }
}

6、 配置模块
如果你需要自定义事件处理器的行为,可以在 forRoot 方法中传递配置选项

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

@Module({
   
  imports: [
    EventEmitterModule.forRoot({
   
      // 配置项
      delimiter: ':', // 定义事件名称中的分隔符,默认值是 '.'。
      wildcard: true, // 启用或禁用通配符支持,如果启用,那么可以使用通配符来订阅事件
      // 当有新的监听器被添加时触发的回调函数
      newListener: (eventName, listener) => {
   
        console.log(`New listener added for event: ${
     eventName}`);
      },
      // 当监听器被移除时触发的回调函数
      removeListener: (eventName, listener) => {
   
        console.log(`Listener removed for event: ${
     eventName}`);
      },
      // 当事件处理过程中出现错误时的回调函数
      errorHandler: (err, eventName, listener) => {
   
        console.error(`Error handling event '${
     eventName}':`, err);
      },
      maxListeners: 10, // 设置最大监听器数量。超过此数量时,将抛出警告
      captureRejections: true, // 是否捕获异步函数的拒绝(rejection)。如果设置为 true,则会在事件处理函数中捕获 Promise.reject
      wrapEmitters: true, // 是否包装事件发射器。如果设置为 true,那么所有的事件发射器都会被包装,以提供更多的功能
      ignoreErrors: true, // 当事件处理过程中出现错误时,是否忽略这些错误。如果设置为 true,则不会抛出错误,而是会被忽略
    }),
  ],
})
export class AppModule {
   }

通过这些配置选项,你可以根据自己的需求定制事件发布/订阅的行为,使其更符合你的应用程序的具体要求。

总结

Nest.js 中集成 @nestjs/event-emitter 模块,可以极大地提升应用程序的事件驱动能力。通过采用事件发布/订阅模式,我们可以构建出更为松耦合、易扩展且高度灵活的系统架构。借助其内置的错误处理机制和事件监听管理功能,我们能够构建出更加健壮和可靠的应用程序。总体而言,@nestjs/event-emitter 是构建现代、响应迅速且具有高度解耦特性的 Nest.js 应用程序的理想选择。

相关文章
|
29天前
|
JavaScript 前端开发
JavaScript 事件
JavaScript 事件
30 2
|
1月前
|
JavaScript
Nest.js 实战 (十一):配置热重载 HMR 给服务提提速
这篇文章介绍了Nest.js服务在应用程序引导过程中,TypeScript编译对效率的影响,以及如何通过使用webpackHMR来降低应用实例化的时间。文章包含具体教程,指导读者如何在项目中安装依赖包,并在根目录下新增webpack配置文件webpack-hmr.config.js来调整HMR相关的配置。最后,文章总结了如何通过自定义webpack配置来更好地控制HMR行为。
|
27天前
Nest.js 实战 (十三):实现 SSE 服务端主动向客户端推送消息
这篇文章介绍了在Nest.js应用中使用Server-Sent Events (SSE)的技术。文章首先讨论了在特定业务场景下,为何选择SSE而不是WebSocket作为实时通信系统的实现方式。接着解释了SSE的概念,并展示了如何在Nest.js中实现SSE。文章包含客户端实现的代码示例,并以一个效果演示结束,总结SSE在Nest.js中的应用。
Nest.js 实战 (十三):实现 SSE 服务端主动向客户端推送消息
|
16天前
|
JavaScript 前端开发 安全
js逆向实战之烯牛数据请求参数加密和返回数据解密
【9月更文挑战第20天】在JavaScript逆向工程中,处理烯牛数据的请求参数加密和返回数据解密颇具挑战。本文详细分析了这一过程,包括网络请求监测、代码分析、加密算法推测及解密逻辑研究,并提供了实战步骤,如确定加密入口点、逆向分析算法及模拟加密解密过程。此外,还强调了法律合规性和安全性的重要性,帮助读者合法且安全地进行逆向工程。
64 11
|
11天前
|
JavaScript 前端开发
JavaScript HTML DOM 事件
JavaScript HTML DOM 事件
14 5
|
11天前
|
监控 JavaScript 前端开发
|
1月前
|
缓存 JavaScript 前端开发
JavaScript模块化开发:ES6模块与CommonJs的对比与应用
JavaScript模块化开发:ES6模块与CommonJs的对比与应用
22 2
|
24天前
|
JavaScript 前端开发
js事件队列
js事件队列
25 0
|
JavaScript 前端开发
JavaScript发布/订阅实例
原文链接: Pub/Sub JavaScript Object原文日期: 2014年6月11日翻译日期: 2014年6月13日翻译人员: 铁锚 高效AJAX网站的三大杀器: 事件代理, 浏览历史管理, 以及高效应用级 发布/订阅通信机制. 本博客的原文站点 同时使用了这三种技术,本文中作者将分享其中最简单的一个: 该网站使用的 一个微型 发布/订阅模块。
714 0
|
3月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
78 2