Trabalhando com eventos no NestJS \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 15 Horas 

 50 Min 

 08 Seg 

   Tempo restante da oferta: 15 50 08 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Trabalhando com eventos no NestJS  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) [ Node ](https://www.treinaweb.com.br/blog/categoria/node-js) 

# Trabalhando com eventos no NestJS

 Neste artigo vamos aprender a utilizar os eventos com o NestJS, criando um exemplo onde vamos simular o envio de e-mails.

 [ Wesley Gado ](https://www.treinaweb.com.br/blog/autor/wesley-gado) 3 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2023/05/NEST-JS-UPLOAD-ARQUIVOS.png)  

Neste artigo vamos utilizar o Node.js com o framework [NestJS](https://www.treinaweb.com.br/blog/o-que-e-nestjs) para demonstrar o uso de eventos, um recurso eficidente de lidar com a comunicação entre diferentes partes de uma aplicação. Vamos criar um exemplo para entender melhor o seu uso.

[  ![Nest.js - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/nest-js.svg)   Curso Nest.js - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/nestjs-fundamentos)

## Cenário

A API receberá os dados do usuário para cadastrar um usuário no cenário do exemplo. Após o cadastro, o usuário receberá dois emails: um e-mail de confirmação do cadastro e outro contendo um link para a criação de uma nova senha.

## Configurando o projeto

Primeiramento, caso você não tenha o ambiente Node.js instalado, siga os passos do artigo [instalando node.js](https://www.treinaweb.com.br/blog/instalacao-do-node-js-windows-mac-e-linux). Logo em seguida faça a instalação do NestJS CLI, utilizando o seguinte comando:

```tsx
npm i -g @nestjs/cli

```

Agora podemos criar um novo projeto utilizando o comando:

```tsx
nest new evento

```

Perfeito, a estrutura e os arquivos serão gerados. Para o exemplo, vamos simplesmente criar a interface User, para simular o cadastro de usuário, ao “cadastrar” esse usuário, a aplicação irá utilizar os eventos para disparar os e-mails conforme explicado acima, para isso teremos as seguintes implementações:

- Arquivo referente a interface `User`:

```tsx
//user.interface.ts
export interface User {
  name: string,
  email: string
}

```

Neste caso o usuário terá somente duas propriedades, name e email.

- Arquivo referente ao controller:

```tsx
//app.controller.ts
import { Body, Controller, Get, Post } from '@nestjs/common';
import { AppService } from './app.service';
import { User } from './user.interface';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) { }

  @Post()
  createUser(@Body() user: User): User {
    return this.appService.createUser(user);
  }
}

```

Utilizamos o controller padrão gerado pelo NestJS, porém alteramos a rota Get para Post, onde vamos receber na requisição um usuário e chamar o método `createUser`da camada de serviço, passando o user como parâmetro.

- Arquivo referente a camada service:

```tsx
//app.service.ts
import { Injectable } from '@nestjs/common';
import { User } from './user.interface';

@Injectable()
export class AppService {
  createUser(user: User): User {
   //chamada que faz o cadastro no banco.
    return user;
  }
}

```

Note que simplesmente retornamos o usuários “cadastrado”. É importante salientar que, em um projeto real, este usuário seria salvo no banco de dados. No entanto, para fins didáticos, vamos nos concentrar agora na utilização dos eventos para o envio dos emails.

## Criando o emissor de eventos

Finalmente, podemos configurar o evento que usaremos para o nosso exemplo. O primeiro passo é instalar o pacote `event-emitter` para o NestJS e criar o service que usaremos para criar o emissor do evento com os seguintes comandos:

```bash
npm i --save @nestjs/event-emitter

```

Após instalar o `event-emitter` , vamos importá-lo no módulo principal da aplicação:

```tsx
//app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { EventEmitterService } from './events/event-emitter.service';
import { EventEmitterModule } from '@nestjs/event-emitter';

@Module({
  imports: [EventEmitterModule.forRoot()],
  controllers: [AppController],
  providers: [AppService, EventEmitterService],
})
export class AppModule { }

```

Agora vamos criar o service relacionado aos eventos utilizando o Nest CLI:

```bash
nest generate service event-emitter

```

O Nest irá criar o diretório `event-emitter`, para facilitar o exemplo, vamos renomear a pasta para `events` e excluir o arquivo de teste que irá gerar dentro deste diretório (o arquivo .spec), em seguida vamos criar o emissor de evento, ou seja, o método que irá emitir o evento e disparar as ações no arquivo `event-emitter.service.ts`:

```tsx
//event-emitter.service.ts
import { Injectable } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { User } from 'src/user.interface';

@Injectable()
export class EventEmitterService {
    constructor(private eventEmitter: EventEmitter2) { }

    sendNewUserEmails(user: User): void {
        this.eventEmitter.emit('user.created', user);
    }
}

```

Veja que utilizamos a injeção de dependências para acessar o `eventEmitter` , criamos o método `sendNewUserEmails()`, este método irá executar o `event.emit()`, desta forma podemos passar como paramêtro a string relacionada ao nome do evento, no caso: `user.created`, que passamos como primeiro parâmetro. Outro ponto é que passamos o objeto `user` como segundo parâmetro, pois ele será utilizado nos eventos que serão acionados.

[  ![Nest.js -  Desenvolvimento de APIs REST](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/nest-js.svg)   Curso Nest.js - Desenvolvimento de APIs REST Conhecer o curso ](https://www.treinaweb.com.br/curso/nestjs-desenvolvimento-de-apis-rest)

## **Criando um observador de Eventos**

Agora precisamos criar os eventos que serão acionados quando o `event.emit()`for executado, para isso utilizamos o decorator `@OnEvent()` e passamos o evento que foi descrito no `event.emit()` que no caso é o evento `user.created`.

```tsx
//event-emitter.service.ts
import { Injectable } from '@nestjs/common';
import { EventEmitter2, OnEvent } from '@nestjs/event-emitter';
import { User } from 'src/user.interface';

@Injectable()
export class EventEmitterService {
    constructor(private eventEmitter: EventEmitter2) { }

    sendNewUserEmails(user: User): void {
        this.eventEmitter.emit('user.created', user);
    }

    @OnEvent('user.created')
    emailNewUser(user: User): void {
        console.log(`Envia email para ${user.name} confirmando o cadastro`);
    }

    @OnEvent('user.created')
    newUserPassword(user: User): void {
        console.log(`Envia email para ${user.email} com as instruções de criação de senha.`);
    }
}

```

Implementamos dois métodos relacionados a um único evento, ou seja, quando um usuário for cadastrado, a aplicação enviará dois emails, um sobre a confirmação do cadastro e outro para a criação de uma senha. Por último, precisamos chamar o evento de envio dos emails no service

```tsx
//app.service.ts
import { Injectable } from '@nestjs/common';
import { User } from './user.interface';
import { EventEmitterService } from './events/event-emitter.service';

@Injectable()
export class AppService {
  constructor(private event: EventEmitterService) { }
  createUser(user: User): User {
   //chamada que faz o cadastro no banco.
    this.event.sendNewUserEmails(user);
    return user;
  }
}

```

## Testando

Vamos executar a aplicação com o comando `npm run start:dev` e enviar uma requisição para a rota post que foi crianda no controller, contendo os dados de um usuário:

![cadastrando usuário para disparar os eventos](https://dkrn4sk0rn31v.cloudfront.net/uploads/2024/01/cadastrando-usuario-evento.png)

Perfeito, recebemos o retorno 201 created e os dados do usuário “cadastrado”. No exemplo não implementamos o envio propriamente dito dos emails, mas simulamos o envio destes emails com duas mensagens que serão lançadas no console quando o evento for acionado. Ao consultar o terminal, temos o seguinte resultado:

![simulando envio de emails](https://dkrn4sk0rn31v.cloudfront.net/uploads/2024/01/simulando-envio-email.png)

O evento foi disparados com sucesso!

[  ![Nest.js  - Banco de dados com TypeORM](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/nest-js.svg)   Curso Nest.js - Banco de dados com TypeORM Conhecer o curso ](https://www.treinaweb.com.br/curso/nestjs-banco-de-dados-com-typeorm)

## Conclusão

O interessante é que, com essa estrutura onde os eventos são disparados quando um usuário é cadastrado, permite que a nossa aplicação fique mais independente, nós podemos controlar os eventos que serão disparados quando um usuário é cadastrado sem precisar alterar o método `createUser()`. Por exemplo, caso no futuro seja necessário implementar uma feature onde o usuário cadastrado deva ser enviado como “lead” para um CRM, nós podemos implementar de forma independente e utilizar o decorator `@OnEvent()` observando quando o evento `user.created` for chamado sem alterar qualquer outra parte da nossa aplicação relacionda ao cadastro de usuário.

Por fim, caso queira aprender mais sobre [NestJS](https://nestjs.com/) saiba que aqui na [TreinaWeb](https://treinaweb.com.br/) temos o curso [Nest.js - Fundamentos](https://www.treinaweb.com.br/curso/nestjs-fundamentos) que possui **02h07 de vídeos** e um total de **18 exercícios**. Conheça também nossos outros cursos de [TypeScript](https://www.treinaweb.com.br/busca?q=TypeScript).

Veja quais são os tópicos abordados durante o curso de Nest.js - Fundamentos:

- Conhecendo a estrutura;
- Utilizando Nest CLI;
- Entendendo Rotas, Controllers e Views;
- Conexão com banco de dados;
- Usando TypeORM;
- Template Engine.

- [ #Eventos ](https://www.treinaweb.com.br/blog/tag/eventos)
- [ #Node.js ](https://www.treinaweb.com.br/blog/tag/node-js)
- [ #NestJS ](https://www.treinaweb.com.br/blog/tag/nestjs)

Autor

 ![Wesley Gado](//secure.gravatar.com/avatar/1b770ca482a7232b1885881430a592bb?d=mm)

## Wesley Gado

 Formado em Análise e Desenvolvimento de Sistemas pelo Instituto Federal de São Paulo, atuou em projetos como desenvolvedor Front-End. Nas horas vagas grava Podcast e arrisca uns três acordes no violão. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wesley-gado)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/javascript-comandos-do-console-400x280.png)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     5 anos atrás

    ##  [ Trabalhando com data no JavaScript ](https://www.treinaweb.com.br/blog/trabalhando-com-data-no-javascript) 

     Neste artigo veremos como manipular datas no JavaScript, utilizando a classe Date, como pegar a data atual e utilizar os métodos da classe.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/05/01125223/react-php-imagem-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Trabalhando com Sockets no ReactPHP ](https://www.treinaweb.com.br/blog/trabalhando-com-sockets-no-reactphp) 

     Veremos neste artigo como usar o componente de socket do ReactPHP para criar um chat pelo terminal. Além disso, veremos as bases para a construção de servidores TCP/IP.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/04/DOM-JAVASCRIPT-400x280.png)  [ Desenvolvimento Front-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-front-end) 

     6 anos atrás

    ##  [ Trabalhando com JavaScript no navegador ](https://www.treinaweb.com.br/blog/trabalhando-com-javascript-no-navegador) 

     Ao utilizar JavaScript para desenvolvimento web, é necessário entender o funcionamento do DOM (Document Object Model). O DOM é o que permite o acesso aos elementos HTML/XML para manipulá-los de forma que seja interessante para os nossos objetivos como desenvolvedor.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/11/12132017/introducao-swoole-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Trabalhando com corrotinas, canais e explorando um pouco mais o scheduler de corrotinas do Swoole ](https://www.treinaweb.com.br/blog/trabalhando-com-corrotinas-canais-e-explorando-um-pouco-mais-o-scheduler-de-corrotinas-do-swoole) 

     Neste artigo trabalharemos com os conceitos fundamentais de corrotinas, canais, defer etc, também exploraremos algumas opções do scheduler como, por exemplo, fazê-lo operar de forma preemptiva.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/03/26181326/CAPA-ELTON-MARÇO-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     8 anos atrás

    ##  [ Como melhorar o retorno das suas APIs no Laravel com API Resource do Eloquent ](https://www.treinaweb.com.br/blog/como-melhorar-o-retorno-das-suas-apis-no-laravel-com-api-resource-do-eloquent) 

     Um dos pontos mais importantes quando estamos trabalhando APIs é o retorno dos dados. Veja como melhorar suas APIs no Laravel usando o API Resouce do Eloquent.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/10/5-dicas-para-conseguir-um-bom-estagio-400x280.png)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     5 anos atrás

    ##  [ 5 dicas para conseguir um bom estágio ](https://www.treinaweb.com.br/blog/5-dicas-para-conseguir-um-bom-estagio) 

     Conquistar a primeira experiência profissional para adquirir experiência na área pode parecer difícil - e às vezes é mesmo. Por isso, separamos algumas ações simples, para tentar facilitar essa busca e te ajudar a conseguir as oportunidades da melhor maneira.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/11/12132017/introducao-swoole-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ Introdução ao Swoole, framework PHP assíncrono baseado em corrotinas ](https://www.treinaweb.com.br/blog/introducao-ao-swoole-framework-php-assincrono-baseado-em-corrotinas) 

     Uma Introdução ao Swoole, framework PHP assíncrono baseado em corrotinas e comparação dele com o modelo tradicional que usa um servidor web (nginx, apache etc) com PHP-FPM.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/04/27171327/reinaldo-ferraz-400x280.png)  [ Entrevistas ](https://www.treinaweb.com.br/blog/categoria/entrevistas) 

     8 anos atrás

    ##  [ TW Entrevista 09: Reinaldo Ferraz ](https://www.treinaweb.com.br/blog/tw-entrevista-09-reinaldo-ferraz) 

     Fizemos uma série de entrevistas chamada "TW Entrevista". O entrevistado de hoje é o Reinaldo Ferraz, especialista em Acessibilidade para a Web e que trabalha na W3C Brasil.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/03/29143419/TW-ENTREVISTAS-FELIPE-MOURA-400x280.png)  [ Entrevistas ](https://www.treinaweb.com.br/blog/categoria/entrevistas) 

     9 anos atrás

    ##  [ TW Entrevista 02: Felipe Moura ](https://www.treinaweb.com.br/blog/tw-entrevista-02-felipe-moura) 

     Fizemos uma série de entrevistas com desenvolvedores chamada “TW Entrevista”. O entrevistado de hoje é o Felipe Moura, co-fundador da Nasc e da maior conferência de JavaScript do mundo, a BrazilJS.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/dicas-programadores-iniciantes-400x280.png)  [ Desenvolvimento ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento) 

     6 anos atrás

    ##  [ Dicas para programadores iniciantes ](https://www.treinaweb.com.br/blog/dicas-para-programadores-iniciantes) 

     Confira neste artigo algumas dicas para programadores iniciantes, que tem a finalidade de ajudá-los a trilhar seus caminhos nessa área.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/Micro-Front-End-Microserviços-no-seu-navegador-400x280.png)  [ Arquitetura de Software ](https://www.treinaweb.com.br/blog/categoria/arquitetura-de-software) 

     6 anos atrás

    ##  [ Micro Front-End - Microserviços no seu navegador ](https://www.treinaweb.com.br/blog/micro-front-end-microservicos-no-seu-navegador) 

     Entenda o que são Micro Front-ends, como funcionam, suas vantagens e quando você deve escolher esta estratégia para a arquitetura de suas aplicações.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/08/praticas-que-todo-desenvolvedor-que-nao-trabalha-em-uma-equipe-deveria-seguir-400x280.jpg)  [ Carreira ](https://www.treinaweb.com.br/blog/categoria/carreira) 

     9 anos atrás

    ##  [ Práticas que todo desenvolvedor que não trabalha em uma equipe deveria seguir ](https://www.treinaweb.com.br/blog/praticas-que-todo-desenvolvedor-que-nao-trabalha-em-uma-equipe-deveria-seguir) 

     Falaremos nesse artigo das vantagens, desvantagens e práticas importantes para nos mantermos em alto nível mesmo quando não trabalhamos em uma equipe.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **15h 50min 08s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
