What are Events?
Events are signals or notifications that indicate that an action or change of state has occurred. In the context of applications, events allow different parts of the system to communicate in an asynchronous and decoupled way. This is especially useful in microservices architectures, where you need components to function independently but still be able to “listen” and react to changes happening elsewhere in the system.
Events in NestJS
In NestJS, implementing events is done in a simple and intuitive way using the EventEmitter2 library, which is an extension of the native Node.js EventEmitter, with more features. Next, let's see how to configure and use events in NestJS.
Configuring Events in NestJS
First, you need to install the @nestjs/event-emitter package, which offers complete integration of EventEmitter2 with NestJS:
npm install @nestjs/event-emitter
After installing the package, import the EventEmitterModule module into your application's main module:
import { Module } from '@nestjs/common'; import { EventEmitterModule } from '@nestjs/event-emitter'; @Module({ imports: [ EventEmitterModule.forRoot(), // Importando o EventEmitterModule // outros módulos ], }) export class AppModule {}
With the module configured, you can start creating and handling events in your application.
Creating and Issuing Events
Let's create a basic example where an event is emitted when a new user is created.
1. Create an Event:
First, we define a class to represent our event:
export class UserCreatedEvent { constructor( public readonly userId: string, public readonly email: string, ) {} }
2. Emitting the Event:
In the service where user creation logic is implemented, you can emit the event after the user is created:
import { Injectable } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { UserCreatedEvent } from './events/user-created.event'; @Injectable() export class UserService { constructor(private readonly eventEmitter: EventEmitter2) {} async createUser(email: string) { // Lógica para criar o usuário const userId = '12345'; // Exemplo de ID gerado // Emitir o evento const event = new UserCreatedEvent(userId, email); this.eventEmitter.emit('user.created', event); } }
Here the user.created event is emitted whenever a new user is created.
Listening and Responding to Events
To react to emitted events, you can create listeners, which are functions or methods that will be called when the corresponding event is triggered.
1. Creating a Listener:
A listener is a class that reacts to a specific event:
import { OnEvent } from '@nestjs/event-emitter'; import { Injectable } from '@nestjs/common'; import { UserCreatedEvent } from './events/user-created.event'; @Injectable() export class UserCreatedListener { @OnEvent('user.created') handleUserCreatedEvent(event: UserCreatedEvent) { console.log('Usuário criado com sucesso:', event.userId, event.email); // Lógica adicional, como enviar um e-mail de boas-vindas } }
2. Registering the Listener:
For NestJS to recognize the listener, it must be registered in the corresponding module:
import { Module } from '@nestjs/common'; import { UserService } from './user.service'; import { UserCreatedListener } from './listeners/user-created.listener'; @Module({ providers: [UserService, UserCreatedListener], }) export class UserModule {}
Now, every time the user.created event is emitted, the handleUserCreatedEvent method will be called.
Advanced Event Applications
Events can be used in various scenarios to improve application architecture:
Conclusion
Using events in NestJS is a powerful way to create modular, scalable, and easy-to-maintain systems. Through integration with EventEmitter2, NestJS makes it easy to create, emit, and listen for events, allowing you to implement event-driven architectures simply and effectively. Whether for communication between microservices or for asynchronous processing, events are an essential tool in any NestJS developer's arsenal.
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3