Introdução ao Nest.js: quanto melhor
Por Matthew Tyson
Arquiteto de Software, InfoWorld |
Não deve ser confundido com Next.js, Nest.js é uma abordagem mais nova e exclusiva para a tecnologia de servidor JavaScript. É necessário um servidor familiar como Express ou Fastify e camadas de uma série de abstrações úteis, que são voltadas para capacitar e simplificar o design de aplicativos de nível superior. Graças à sua combinação distinta de paradigmas de programação, suporte TypeScript de primeira ordem e recursos integrados como injeção de dependência, a popularidade do Nest.js tem crescido constantemente nos últimos anos.
Nest.js é uma contribuição interessante para o ecossistema JavaScript e merece sua atenção. É uma ótima ferramenta para se ter em mente ao trabalhar com JavaScript e TypeScript do lado do servidor.
Neste artigo, faremos um tour rápido pelo Nest.js, com exemplos que incluem roteamento, controladores, produtores (injeção de dependência) e autenticação com guardas. Você também entenderá o sistema de módulos Nest.js.
Nosso exemplo é um aplicativo utilizado para gerenciar uma lista de receitas de massas. Incluiremos um serviço com injeção de dependência que gerencia o conjunto de dados real e uma API RESTful que podemos usar para listar todas as receitas ou recuperar uma única receita por ID. Também configuraremos um endpoint PUT autenticado simples para adicionar novas receitas.
Vamos começar estruturando um novo projeto. Feito isso, podemos mergulhar nos exemplos.
Podemos usar a interface de linha de comando Nest.js para configurar um layout rápido do aplicativo, começando com a instalação global do Nest com: $ npm install -g @nestjs/cli. Além do comando create, o nestjs inclui recursos úteis como gerar para compartilhar designs reutilizáveis. A instalação global nos dá acesso a isso e muito mais.
Agora podemos criar uma nova aplicação com: $ nest new iw-nest. Você pode selecionar qualquer gerenciador de pacotes desejado (npm, yarn ou pnpm). Para esta demonstração, usarei pnpm. O processo é o mesmo independentemente.
Mude para o novo diretório /iw-nest e inicie o servidor de desenvolvimento com: $ pnpm run start. Você pode verificar se o aplicativo está sendo executado visitando localhost:3000, onde você verá uma mensagem “Hello, World!” mensagem. Esta mensagem vem de iw-nest/src/app.controller.ts. Se você olhar esse arquivo, verá que ele está usando um serviço injetado. Vamos criar um novo controlador (src/recipes.controller.ts) que retorna uma lista de receitas, conforme mostrado na Listagem 1.
A Listagem 1 nos dá uma visão básica do roteamento em Nest.js. Você pode ver que usamos a anotação @Controller('recipes') para definir a classe como um controlador com a rota de /recipes. O método getRecipes() é anotado para lidar com o método GET com @Get().
Por enquanto, este controlador simplesmente mapeia o /recipes GET para uma string de resposta codificada. Antes que Nest.js sirva isso, precisamos registrar o novo controlador com o módulo. Módulos são outro conceito importante no Nest, usados para ajudar a organizar o código do seu aplicativo. No nosso caso, precisamos abrir /src/app.module.ts e adicionar o controlador, conforme mostrado na Listagem 2.
A estrutura de injeção de dependência em Nest.js é uma reminiscência do Spring no ecossistema Java. Ter apenas injeção de dependência integrada faz com que valha a pena considerar o Nest.js, mesmo sem seus outros recursos.
Vamos definir um provedor de serviços e conectá-lo ao nosso controlador. Esta é uma maneira limpa de manter o aplicativo organizado em camadas. Você pode ver nossa nova classe de serviço, /src/recipes.service.ts, na Listagem 3.
Para usar esse provedor de serviços, também precisamos adicioná-lo ao arquivo app.module.ts, conforme mostrado na Listagem 4.
Os módulos são uma boa maneira de organizar um aplicativo. Eles podem atuar como um mecanismo de agrupamento lógico, fornecendo uma estrutura hierárquica onde os módulos mais fundamentais estão claramente definidos e os demais dependem deles.
Agora podemos usar o serviço no RecipesController, conforme mostrado na Listagem 5. Se você é novo na injeção de dependência, isso pode parecer muito trabalho extra. Mas a capacidade de definir e consumir classes em toda a aplicação, de maneira padronizada, pode ser um verdadeiro benefício para a arquitetura da sua aplicação à medida que o sistema cresce.