Tutorial NestJS para Iniciantes

Node.js

Tutorial NestJS para Iniciantes

Luiz Duarte
Escrito por Luiz Duarte em 07/09/2023
Junte-se a mais de 34 mil devs

Entre para minha lista e receba conteúdos exclusivos e com prioridade

NestJS é um framework web (backend) que opera em cima do popular Express. Diferente do seu “motor” interno, o NestJS é opinativo, ou seja, define padrões (inspirados no Angular, aliás), mas apesar disso é muito extensível, permitindo a troca de componentes e padrões na maioria dos casos, motivo pelo qual tem ganhado cada vez mais popularidade desde seu lançamento em 2017. Além disso, o NestJS foca no desenvolvimento nativo com TypeScript e no uso de Orientação à Objetos, incluindo Design Patterns, o que o torna um framework mais intermediário, por assim dizer.

A ideia do tutorial de hoje é justamente compartilhar os meus estudos de desenvolvimento de backend usando NestJS. Entenda que este não deve ser o seu primeiro contato com o ecossistema Node.js e menos ainda com a linguagem TypeScript ou o protocolo HTTP. Você encontra tutoriais aqui no blog ensinando estes pré-requisitos caso necessite, basta procurar pelos nomes na barra de busca.

Se preferir, você pode assistir ao vídeo abaixo ao invés de ler este tutorial, o conteúdo é o mesmo.

Vamos lá!

Curso FullStack

Vantagens do NestJS

No vídeo abaixo eu falo um pouco sobre o que é o Nest e algumas diferenças relativas ao Express, seu principal concorrente.

É importante frisar que algumas características do NestJS podem ser tratadas tanto como vantagens, quanto como desvantagens, principalmente considerando o seu background, o seu projeto, etc. Mas de um modo geral, temos como vantagens deste framework:

Arquitetura Modular: O NestJS incentiva a criação de aplicativos com uma arquitetura modular e organizada. Ele utiliza conceitos como módulos, controladores e provedores para dividir o código em partes reutilizáveis e independentes, tornando o desenvolvimento mais organizado e fácil de manter.

TypeScript: O NestJS é escrito em TypeScript, o que significa que você pode aproveitar os recursos de tipagem estática para evitar erros comuns de runtime e melhorar a legibilidade do código. O TypeScript também oferece uma experiência de desenvolvimento mais robusta com ferramentas como autocompletar e verificação de tipos. Você pode aprender o básico de TypeScript nesta série aqui do blog.

Injeção de Dependência: O framework suporta injeção de dependência, o que facilita a criação de componentes reutilizáveis e a gestão das dependências entre eles. Isso torna o código mais testável e facilita a substituição de implementações de dependências.

Suporte a WebSockets: O NestJS oferece suporte nativo a WebSockets, tornando mais fácil a criação de aplicativos em tempo real e interativos. Isso é especialmente útil para aplicativos de bate-papo, jogos e outras aplicações que exigem comunicação bidirecional. Você pode aprender o básico de servidor de WebSockets neste tutorial.

Documentação Automática: O NestJS possui um módulo de documentação automática (Swagger) que gera automaticamente documentação interativa para sua API com base em suas anotações de código. Isso torna mais fácil para os desenvolvedores e equipes de suporte entenderem e testarem a API.

Testabilidade: A estrutura é projetada com a testabilidade em mente. Isso significa que você pode facilmente escrever testes unitários e de integração para seus componentes, garantindo a qualidade do seu código. Se você não sabe nada de testes de software, essa guia de estudos pode te ajudar.

Performance: O NestJS é construído com o Node.js, que é conhecido por sua eficiência de alto desempenho. Você pode criar aplicativos escaláveis e de alto desempenho com o NestJS. Em alguns cenários, pode ser necessário um tempo extra para otimizar o desempenho do NestJS em comparação com outras estruturas mais leves, especialmente para aplicações de alta concorrência.

Suporte a GraphQL: O NestJS possui um módulo GraphQL que facilita a criação de APIs GraphQL de forma eficiente. Isso é útil para criar APIs flexíveis e eficazes para consultas específicas de clientes. Não vamos trabalhar com GraphQL nesta série, mas quem sabe no futuro?

Compatibilidade com Express: O NestJS pode ser usado com o Express.js, o que significa que você pode aproveitar o ecossistema existente de middleware e ferramentas do Express, se necessário. Não apenas ele PODE, como ele É por padrão, mas para integração com middleware existentes, essa transição pode não ser perfeita em todos os casos, e algumas bibliotecas podem não ser totalmente compatíveis. Caso você nunca tenha usado ExpressJS antes, esta guia de estudos pode te ajudar.

Livro Node.js

Desvantagens do NestJS

E como nem tudo são flores, estas são as maiores desvantagens do uso de NestJS:

Curva de Aprendizado: Para desenvolvedores que não têm experiência anterior com o ExpressJS ou com o TypeScript, pode haver uma curva de aprendizado íngreme. O TypeScript, em particular, pode ser desafiador para aqueles que estão acostumados com JavaScript puro. Em projetos simples, o NestJS pode ser excessivamente complexo. Se você está desenvolvendo uma API simples ou um aplicativo pequeno, pode ser mais prático optar por uma estrutura mais leve.

Overhead de Abstração: Embora a abstração e a estrutura organizacional do NestJS possam ser benéficas em projetos grandes e complexos, em projetos menores ou simples, podem adicionar um nível de complexidade desnecessário. O NestJS, devido à sua estrutura e abstrações, pode consumir mais recursos de memória em comparação com abordagens mais minimalistas.

Flexibilidade Limitada: A estrutura rígida do NestJS (embora não tão rígida quanto do AdonisJS) pode limitar a flexibilidade em alguns casos. Se você precisa de total controle sobre a estrutura de seu aplicativo, pode achar que o NestJS impõe muitas convenções se comparado a ExpressJS, por exemplo.

Tamanho do Pacote: O NestJS inclui uma série de recursos e dependências que podem aumentar o tamanho do pacote de seu aplicativo. Isso pode não ser um problema para todos os projetos, mas em alguns casos pode ser uma desvantagem, especialmente em aplicativos com restrições de tamanho.

Ecossistema Menor: Embora o NestJS tenha uma comunidade ativa, seu ecossistema é menor em comparação com outros frameworks mais estabelecidos, como o Express.js. Isso pode significar menos opções de bibliotecas e plugins prontos para uso, mas não se preocupe pois o NestJS tem uma comunidade ativa e crescente, o que significa que você pode encontrar muitos recursos, bibliotecas e plugins disponíveis para acelerar o desenvolvimento. Além disso, é apoiado pela mesma equipe por trás do Angular, o que aumenta a confiabilidade e o suporte a longo prazo.

Necessidade de Manutenção Contínua: Como qualquer framework ou tecnologia, o NestJS requer manutenção contínua para acompanhar atualizações e correções de segurança, o que pode ser uma carga adicional para as equipes de desenvolvimento.

Entendidos esses pontos, vamos criar nosso primeiro exemplo de webapi usando este fantástico framework!

Curso Node.js e MongoDB

Ambiente

O primeiro passo é se certificar que você tem tudo que é necessário para trabalhar em um projeto NestJS na sua máquina, a começar pelo Node.js, o Visual Studio Code e, geralmente, o Git também. Ensino a instalar os três neste vídeo abaixo, caso precise de ajuda.

Também é muito comum você precisar de alguma ferramenta do tipo HTTP Client como Postman ou Insomnia. Eu particularmente uso o Postman e gosto bastante, deixo abaixo um vídeo para você mostrando como usá-lo.

Mais à frente falaremos de banco de dados e aí voltamos a instalar algum software, se necessário, ok?

Curso Beholder
Curso Beholder

Iniciando um Projeto

Existem algumas formas de iniciar um projeto de webapi NestJS e vou usar aqui a que considero mais simples. Ela consiste em baixar e executar o CLI (Command Line Interface) criado pela equipe do Nest, dando um nome ao novo projeto. Esse CLI vai fazer o que chamamos de scaffold ou estruturação inicial do projeto com pastas e arquivos mínimos.

Para fazer o scaffold de um novo projeto NestJS desta forma, use o comando abaixo:

Assim que ele baixar as dependências do CLI para execução, ele vai lhe questionar sobre qual gerenciador de pacotes você vai utilizar. Eu utilizo o NPM pois tem as mesmas funcionalidades e (atualmente) a mesma performance dos demais, mas sinta-se livre para escolher o gerenciador que quiser, apenas se mantenha nele até o final do projeto para evitar conflitos.

Mas antes de falarmos da aplicação de exemplo, convém repassarmos a estrutura inicial que foi criada pra gente?

Alguns arquivos você vai entender logo de cara pois são velhos conhecidos e dispensam apresentações, como package.json, o tsconfig.json, etc. Mas alguns arquivos e pastas são específicos do NestJS, à saber:

  • dist: versão transpilada do projeto para JS (production ready);
  • src: aqui vão os arquivos do nosso backend, entrarei em mais detalhes;
  • test: aqui vão os arquivos de testes das rotas (suporte a Jest na caixa);
  • nest-cli.json: arquivo de configuração do Nest CLI

A pasta mais importante obviamente é a src e dentro dela o CLI criou pra gente uma aplicação Nest com apenas um módulo, AppModule. De todos os arquivos desta pasta, o primeiro e que dá o pontapé inicial no backend é o main.ts, onde definimos inclusive a porta que nosso backend vai usar.

Repare como este script cria uma nova aplicação usando uma factory e que ela é criada a partir do AppModule, exportado pelo arquivo app.module.ts.

O backend NestJS é organizado em módulos e o AppModule é um deles. Cabe ao módulo configurar quais serão os controllers que atenderão às requisições e quais os services que processarão de fato as mesmas. Entenda os controllers como as rotas do Express (lógica de infraestrutura) e os services algo mais próximo da lógica da aplicação/negócio. Então enquanto que no app.controller.ts temos:

Isso indica que um GET / chama a função getHello do appService, exportado no app.service.ts.

Claro, tem muita coisa que eu não expliquei, a ideia desse primeiro contato é apenas dar uma visão geral dos arquivos e fluxo da informação. Tem também os arquivos com sufixo “spec”, que são arquivos usados nos testes do Jest. Ao final da instalação e “olhadela” inicial, entre na pasta do projeto e rode o comando abaixo para subir o seu backend de exemplo:

O resultado não poderia ser mais comum para uma primeira experiência com web api.

Na parte 2, exploraremos juntos a criação de rotas em nosso backend NestJS.

Confira neste link

Olá, tudo bem?

O que você achou deste conteúdo? Conte nos comentários.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *