Nest.js —backend com cara de Angular sobre NodeJs
Nest.js é um framework para construir backend em Node.js que trás o modelo arquitetural mais utilizado atualmente de maneira fácil, e aproveitando os principais frameworks do mercado. Iremos ver, que Nest.js traz vários construtos que tornam o trabalho do desenvolvedor organizado e melhor.
Caso você seja programador Java/Spring ou C#/ASP.NET você verá código familiar ao utilizar Nest.js. Por outro lado, se você tem um passado desenvolvendo com JavaScript e JQuery, mantenha sua mente aberta a um novo modelo de desenvolvimento. Por exemplo, iremos utilizar @Controller() para auxiliar (handler) uma requisição HTTP, também iremos implementar a interface NestMiddleware para definir um Express middlewares.
Para desenvolvedores que utilizam Angular, a sintaxe também será familiar. Se você acreditava que Angular é um framework feito para atrair programadores Java e C#, você vai pensar o mesmo do Nest.js, logo, hoje, estamos prestes a observar a tendência de encontrarmos programadores “fullstack node” que irão utilizar Angular + Nest.js + TypeORM feitas por programadores Java e C#.
Acho que vou criar um curso com essa stack, Angular + Nest.js + TypeORM, oque você acha? Escreve ai se você curtiu essa idéia!
Modules
Módulos no Nest.js é a forma básica de construir e agrupar blocos de código de maneira coesa. Para iniciar o Nest.js, nós precisamos informar o módulo raiz da nossa aplicação, logo, a boa prática diz que você deve organizar sua aplicação em um formato de arvore, com um módulo raiz e os seguintes serão suas funcionalidades.
Digamos que estamos escrevendo uma aplicação de controle financeiro pessoal. Logo iremos começar nossa aplicação exemplo definindo um módulo principal, que será nosso módulo raiz.
Para informar ao Nest.js qual será o nosso módulo raiz, precisamos utilizar a classe NestFactory para criar, não apenas a raiz mas toda a arvore de módulos.
Controllers
Como em muitas outras plataformas, Java/Spring ou C#/ASP.NET, controllers no Nest.js são resposaveis por auxiliar no trabalho de receber e tratar uma requisição HTTP, para definir um novo controller, é necessário:
- Expor uma classe nova
- Utilizar o decorator @Controller()
- Adicionar a classe em um módulo, mesmo que seja no raiz
- Decorar algum método com @Get() ou @Post() para receber um requisição get ou post
É utilizando o atributo controllers do decorator @Module() que deixamos a aplicação acessar o módulo.
Components
Você pode criar componentes que podem ser injetados, utilizando injeção de dependências, em outros componentes. Usualmente você irá utilizar um Service para programar sua lógica de negócios, e um Repository para programar uma interação com uma forma de persistência de dados, como o banco de dados por exemplo.
Como exemplo, digamos que temos um Service, que finaliza a compra de um carrinho de compras, para isto, o Servicê irá interagir com um Repository verificando se há os itens em estoque.
No exemplo de código acima, CheckoutService é um componente que pode ser injetado em outro componente, e também em um Controller já com o InventoryRepository dentro dele e funcionando, pois o mesmo também será injetado dentro do CheckoutService.
Mas lembre-se, ao menos por hora, a injeção de dependências ocorre pelo construtor, por isto a correta definição do mesmo é importante para que ocorra tudo corretamente.
Middlewares
Quando queremos agir, antes dos Controllers, nós podemos criar um Middleware implementando a interface NestMiddleware que deve ser decorada com @Middleware(). Esta interface espera que implementemos o método resolve e que retorne um Express Middleware: (req, res, next) => void.
Para ativar nosso middleware, devemos criar um módulo que implementa NestModule para fornecer uma definição concreta do método configure.
No código abaixo, habilitamos o CorsMiddleware apenas para requisições GET no caminho /example
Exception Filters
Temos a nossa disposição uma camada responsável por capturar exceções não tratadas. Nesta camada podemos definir filtros de exceçoes. Para isto, precisamos:
- Criar uma classe que implemente ExceptionFilter
- Decorar a classe com @Catch()
- Implementar o método catch(exception: HttpException, reponse)
O código abaixo, prove uma mensagem padrão sempre que uma exceção ocorre, nós podemos criar um filtro de exceção como:
Então, podemos dizer aos nossos Controllers que utilizem este filtro.
Também podemos usar um filtro global, para isto iremos defini-lo no bootrap da aplicação.
Conclusão
Estar no github trends pode não significar muita coisa para o curto prazo, mas ao menos indica que no curto prazo as pessoas estão interessadas no projeto que ali aparece. Observo a meses o Nest.js no github trends.
Outro projeto interessante, que vem chamando minha atenção é o typeorm, basicamente um Hibernate para TypeScript (Node.js)
Em minha mente, a alguns anos estava a pergunta: “Quanto tempo vai demorar para criarem para o ambiente NodeJs, o mesmo modelo desenvolvimento de software que temos a anos no Java?”. Parece que agora isso está começando a ser possível, veja no twitter abaixo que há o outras pessoas pensando o mesmo.
A boa notícia é que ao utilizar esta nova stack, programadores Java/C# reaproveita os conceitos aprendido, diminuindo a curva de aprendizado, migrando mais facilmente para um ambiente node. Além de que, se a tendência que observo se concretizar, teremos programadores com visões e experiências diferentes no ecossistema node, trazendo novas idéias e ajudando a evolui-lo.
A má noticia, é que vai ter mimimi, por estarem introduzindo uma nova maneira de pensar e desenvolver software no ecosistema node. Aconteceu o mesmo quando chegou o TypeScript, hoje, alguns já viram que TypeScript veio pra ficar. Talvez, veremos o mesmo com esta stack: Angular + Nest.Js + TypeORM.