DEV Community

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

Posted on

2

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.

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

nextjs tutorial video

Youtube Tutorial Series 📺

So you built a Next.js app, but you need a clear view of the entire operation flow to be able to identify performance bottlenecks before you launch. But how do you get started? Get the essentials on tracing for Next.js from @nikolovlazar in this video series 👀

Watch the Youtube series

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay