O que são Eventos?
Eventos são sinais ou notificações que indicam que uma ação ou mudança de estado ocorreu. No contexto de aplicações, eventos permitem que diferentes partes do sistema se comuniquem de maneira assíncrona e desacoplada. Isso é especialmente útil em arquiteturas de microserviços, onde você precisa que os componentes funcionem de forma independente, mas que ainda possam “ouvir” e reagir a mudanças que acontecem em outras partes do sistema.
Eventos no NestJS
No NestJS, a implementação de eventos é feita de maneira simples e intuitiva utilizando a biblioteca EventEmitter2, que é uma extensão do EventEmitter nativo do Node.js, com mais funcionalidades. A seguir, vamos ver como configurar e utilizar eventos no NestJS.
Configurando Eventos no NestJS
Primeiramente, você precisa instalar o pacote @nestjs/event-emitter, que oferece uma integração completa do EventEmitter2 com o NestJS:
npm install @nestjs/event-emitter
Depois de instalar o pacote, importe o módulo EventEmitterModule no módulo principal da sua aplicação:
import { Module } from '@nestjs/common';
import { EventEmitterModule } from '@nestjs/event-emitter';
@Module({
imports: [
EventEmitterModule.forRoot(), // Importando o EventEmitterModule
// outros módulos
],
})
export class AppModule {}
Com o módulo configurado, você pode começar a criar e manipular eventos na sua aplicação.
Criando e Emitindo Eventos
Vamos criar um exemplo básico onde um evento é emitido quando um novo usuário é criado.
1. Criar um Evento:
Primeiro, definimos uma classe para representar nosso evento:
export class UserCreatedEvent {
constructor(
public readonly userId: string,
public readonly email: string,
) {}
}
2. Emitindo o Evento:
No serviço onde a lógica de criação de usuário está implementada, você pode emitir o evento após o usuário ser criado:
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);
}
}
Aqui, o evento user.created é emitido sempre que um novo usuário é criado.
Ouvindo e Respondendo a Eventos
Para reagir a eventos emitidos, você pode criar listeners, que são funções ou métodos que serão chamados quando o evento correspondente for disparado.
1. Criando um Listener:
Um listener é uma classe que reage a um evento específico:
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. Registrando o Listener:
Para que o NestJS reconheça o listener, ele deve ser registrado no módulo correspondente:
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserCreatedListener } from './listeners/user-created.listener';
@Module({
providers: [UserService, UserCreatedListener],
})
export class UserModule {}
Agora, toda vez que o evento user.created for emitido, o método handleUserCreatedEvent será chamado.
Aplicações Avançadas de Eventos
Eventos podem ser usados em vários cenários para melhorar a arquitetura da aplicação:
- Integração com Microserviços: Eventos são uma forma eficiente de comunicação entre microserviços, permitindo que eles se mantenham desacoplados.
- Processamento Assíncrono: Pode-se emitir eventos para realizar operações em segundo plano, como envio de e-mails ou processamento de grandes quantidades de dados.
- Logging e Auditoria: Eventos são ideais para capturar ações do usuário e eventos do sistema para fins de auditoria.
Conclusão
O uso de eventos no NestJS é uma maneira poderosa de criar sistemas modulares, escaláveis e fáceis de manter. Através da integração com o EventEmitter2, o NestJS facilita a criação, emissão e escuta de eventos, permitindo que você implemente arquiteturas orientadas a eventos de forma simples e eficaz. Seja para comunicação entre microserviços ou para processamento assíncrono, eventos são uma ferramenta essencial no arsenal de qualquer desenvolvedor NestJS.
Top comments (0)