DEV Community

Cover image for Eventos no nestjs
Rafael Avelar Campos
Rafael Avelar Campos

Posted on

Eventos no nestjs

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
Enter fullscreen mode Exit fullscreen mode

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 {}
Enter fullscreen mode Exit fullscreen mode

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,
  ) {}
}
Enter fullscreen mode Exit fullscreen mode

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);
  }
}
Enter fullscreen mode Exit fullscreen mode

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
  }
}
Enter fullscreen mode Exit fullscreen mode

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 {}
Enter fullscreen mode Exit fullscreen mode

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:

  1. Integração com Microserviços: Eventos são uma forma eficiente de comunicação entre microserviços, permitindo que eles se mantenham desacoplados.
  2. 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.
  3. 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)