{"id":3408,"date":"2023-08-07T16:15:59","date_gmt":"2023-08-07T19:15:59","guid":{"rendered":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/?p=3408"},"modified":"2025-09-02T14:41:34","modified_gmt":"2025-09-02T17:41:34","slug":"introducao-a-nestjs","status":"publish","type":"post","link":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/2023\/08\/07\/introducao-a-nestjs","title":{"rendered":"Introdu\u00e7\u00e3o a NestJS"},"content":{"rendered":"\n<p class=\"has-text-align-left\">Ol\u00e1 Pessoal! Nesta edi\u00e7\u00e3o do PET Reda\u00e7\u00e3o, vamos entender mais sobre um framework que vem fazendo muito sucesso no desenvolvimento server-side em Node.js, o NestJS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Introdu\u00e7\u00e3o<\/strong><\/h2>\n\n\n\n<p>O Nest \u00e9 um framework Node.js para implementar aplica\u00e7\u00f5es backend eficientes, confi\u00e1veis e escal\u00e1veis utilizando Typescript (padr\u00e3o) ou Javascript. Constru\u00eddo em Typescript, ele utiliza diversos princ\u00edpios, como Programa\u00e7\u00e3o Orientada a Objetos, Programa\u00e7\u00e3o Funcional e Programa\u00e7\u00e3o Funcional Reativa.<\/p>\n\n\n\n<p>Ao optar pelo Nest, voc\u00ea tem a op\u00e7\u00e3o de escolher entre dois dos mais famosos frameworks para servidores HTTP: o Express (padr\u00e3o) e o Fastify. Essa escolha n\u00e3o apenas proporciona uma camada de abstra\u00e7\u00e3o em algumas partes do desenvolvimento, mas tamb\u00e9m garante liberdade para os desenvolvedores adaptarem a estrutura \u00e0s necessidades espec\u00edficas de seus projetos.<\/p>\n\n\n\n<p>O maior problema que o NestJS prop\u00f5e-se a resolver \u00e9 a <i>arquitetura<\/i> em aplica\u00e7\u00f5es server-side Javascript, sendo bastante similar e, at\u00e9 mesmo, inspirado no Angular, um framework para client-side. A arquitetura do NestJS \u00e9, principalmente, dividida em: Controllers, Providers (Services, Repositories, Helpers, etc) e Modules. H\u00e1 outras divis\u00f5es tamb\u00e9m importantes, mas vamos entrar em detalhes em cada uma delas mais tarde.<\/p>\n\n\n\n<p>No t\u00f3pico a seguir veremos como instalar e criar o primeiro projeto com o NestJS e, logo mais, entenderemos mais sobre a arquitetura e os principais fundamentos que o NestJS utiliza, Aproveite!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Instala\u00e7\u00e3o e primeiro projeto<\/strong><\/h2>\n\n\n\n<p>Para ter acesso a todos os recursos que o NestJS oferece \u00e9 necess\u00e1rio instalar a CLI deles. Isso pode ser feito a partir do gerenciador de pacotes do Node.js, o npm, a partir do seguinte comando:<\/p>\n\n\n\n<p><i>&nbsp; &nbsp; npm install -g @nestjs\/cli<\/i><\/p>\n\n\n\n<p>Esse comando instala globalmente (por isso o <i>-g<\/i>) o Nest CLI na sua m\u00e1quina. Agora, vamos entrar em detalhes sobre os comandos do Nest, come\u00e7ando pela cria\u00e7\u00e3o de um novo projeto com NestJS:<\/p>\n\n\n\n<p><i>&nbsp; &nbsp; nest new nome_novo_projeto<\/i><\/p>\n\n\n\n<p><i>&nbsp; &nbsp; nest n nome_novo_projeto<\/i><\/p>\n\n\n\n<p>Ap\u00f3s rodar o comando, vai ser perguntado qual a prefer\u00eancia do gerenciador de pacotes, possuindo 3 op\u00e7\u00f5es: npm, yarn e pnpm. Qualquer uma das op\u00e7\u00f5es vai satisfazer os nossos requisitos, na d\u00favida selecione o npm mesmo (Caso opte pelo yarn ou pnpm, ser\u00e1 necess\u00e1rio instal\u00e1-los globalmente). Abrindo a pasta do projeto criado voc\u00ea vai ver algo assim:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/www.ufsm.br\/app\/uploads\/sites\/791\/2023\/08\/1.jpg\" alt=\"Estrutura do diret\u00f3rio do projeto criado\" \/><figcaption class=\"wp-element-caption\">Estrutura do diret\u00f3rio do projeto criado<\/figcaption><\/figure>\n<\/div>\n\n\n<p>O Nest CLI possui diversos outros comandos \u00fateis para agilizar o processo de desenvolvimento e auxiliar na produtividade, por\u00e9m vamos entender mais sobre alguns deles depois, pois explicar a arquitetura e os fundamentos do NestJS \u00e9 o tema principal dessa reda\u00e7\u00e3o<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Arquitetura<\/strong><\/h2>\n\n\n\n<p>Os controllers s\u00e3o respons\u00e1veis pelo processamento das requisi\u00e7\u00f5es (requests) e retorno de uma resposta (response) para o client. Normalmente, um possui mais de uma rota, por exemplo, temos um controller que gerencia as requisi\u00e7\u00f5es relacionadas ao usu\u00e1rio, dessa forma podemos ter uma rota que retorna todos os usu\u00e1rios, outra que cria um usu\u00e1rio novo, outra para deletar um usu\u00e1rio, etc. At\u00e9 a\u00ed nada de novo das aplica\u00e7\u00f5es server-side comuns, por\u00e9m o NestJS utiliza classes e decorators para criar os controllers.&nbsp;<\/p>\n\n\n\n<p>Os Decorators&nbsp; s\u00e3o uma funcionalidade poderosa e \u00fatil da linguagem TypeScript utilizada para anotar classes, m\u00e9todos, propriedades ou par\u00e2metros de m\u00e9todos. Eles s\u00e3o uma parte fundamental da arquitetura do Nest.js e s\u00e3o amplamente utilizados para definir comportamentos adicionais ou metadados para v\u00e1rias partes de uma aplica\u00e7\u00e3o. Existem v\u00e1rios decorators integrados fornecidos pelo Nest.js, e voc\u00ea tamb\u00e9m pode criar seus pr\u00f3prios decorators personalizados quando necess\u00e1rio.&nbsp;<\/p>\n\n\n\n<p>Para definir um controller, utiliza-se o decorator @Controller, que pode receber um nome como par\u00e2metro. Al\u00e9m disso, as rotas desse controller tamb\u00e9m podem ter diversos decorators, como @Get, @Post, @Patch, etc. Isso \u00e9 necess\u00e1rio para definir o que essa rota deve fazer Um exemplo de um controller de usu\u00e1rios pode ser visto abaixo:<\/p>\n\n\n\n<p>Os providers s\u00e3o uma parte muito importante para a arquitetura do Nest, mas diferente dos controllers, os providers podem ser v\u00e1rios tipos de classes, os mais comuns s\u00e3o services, repositories, helpers, etc. Como visto anteriormente, os controllers s\u00e3o respons\u00e1veis por lidar com requisi\u00e7\u00f5es HTTP, mas al\u00e9m disso, eles tamb\u00e9m encarregam tarefas mais complexas para os providers resolverem. Por exemplo, podemos criar um servi\u00e7o para realizar as tarefas de cada fun\u00e7\u00e3o do nosso controller definido anteriormente. Esse servi\u00e7o deve ter uma fun\u00e7\u00e3o para adicionar novos usu\u00e1rios e retornar todos que j\u00e1 existem. Uma forma simples de realizar isso pode ser vista no exemplo abaixo:<\/p>\n\n\n\n<p>O decorator @Injectable \u00e9 comumente utilizado para o container de Invers\u00e3o de Controle do Nest consiga gerenciar o nosso provider. Esse conceito de Invers\u00e3o de Controle \u00e9 acompanhado por outro conceito chamado Injec\u00e7\u00e3o de Depend\u00eancias, que \u00e9 extremamente importante para entender o funcionamento de aplica\u00e7\u00f5es em NestJS. Um exemplo de Inje\u00e7\u00e3o de depend\u00eancia pode ser feito adaptando o usersController para injetar o usersService nele. Como no exemplo abaixo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>import { Controller, Get, Post } from '@nestjs\/common';\n\n@Controller('users')\nexport class UsersController {\n  @Post()\n  create() {\n    return 'Adiciona novo usu\u00e1rio';\n  }\n\n  @Get()\n  findAll() {\n    return 'Retorna todos usu\u00e1rios';\n  }\n}\n<\/strong><\/code><\/pre>\n\n\n\n<p>Os providers s\u00e3o uma parte muito importante para a arquitetura do Nest, mas diferente dos controllers, os providers podem ser v\u00e1rios tipos de classes, os mais comuns s\u00e3o services, repositories, helpers, etc. Como visto anteriormente, os controllers s\u00e3o respons\u00e1veis por lidar com requisi\u00e7\u00f5es HTTP, mas al\u00e9m disso, eles tamb\u00e9m encarregam tarefas mais complexas para os providers resolverem. Por exemplo, podemos criar um servi\u00e7o para realizar as tarefas de cada fun\u00e7\u00e3o do nosso controller definido anteriormente. Esse servi\u00e7o deve ter uma fun\u00e7\u00e3o para adicionar novos usu\u00e1rios e retornar todos que j\u00e1 existem. Uma forma simples de realizar isso pode ser vista no exemplo abaixo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>import { Injectable } from '@nestjs\/common';\nimport { User } from '.\/interfaces\/user.interface';\n\n@Injectable()\nexport class UsersService {\n  private readonly users: User&#091;] = &#091;];\n\n  create(user: User) {\n    this.users.push(user);\n  }\n\n  findAll(): User&#091;] {\n    return this.users;\n  }\n}\n<\/strong><\/code><\/pre>\n\n\n\n<p>O decorator @Injectable \u00e9 comumente utilizado para o container de Invers\u00e3o de Controle do Nest consiga gerenciar o nosso provider. Esse conceito de Invers\u00e3o de Controle \u00e9 acompanhado por outro conceito chamado Injec\u00e7\u00e3o de Depend\u00eancias, que \u00e9 extremamente importante para entender o funcionamento de aplica\u00e7\u00f5es em NestJS. Um exemplo de Inje\u00e7\u00e3o de depend\u00eancia pode ser feito adaptando o usersController para injetar o usersService nele. Como no exemplo abaixo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>import { Body, Controller, Get, Post } from '@nestjs\/common';\nimport { UsersService } from '.\/users.service';\nimport { User } from '.\/interfaces\/user.interface';\n\n\n@Controller('users')\nexport class UsersController {\n  constructor(private usersService: UsersService) {}\n  @Post()\n  async create(@Body() user: User) {\n    return this.usersService.create(user);\n  }\n\n\n  @Get()\n  async findAll(): Promise&lt;User&#091;]&gt; {\n    return this.usersService.findAll();\n  }\n}\n<\/strong><\/code><\/pre>\n\n\n\n<p>Com essa adapta\u00e7\u00e3o, o usersService \u00e9 injetado no constructor da classe do usersController e utiliza-se dos m\u00e9todos que create e findAll que esse provider possui. No Nest, esse controle de depend\u00eancias \u00e9 feito a partir da tipagem do Typescript, por isso s\u00f3 \u00e9 ncess\u00e1rio colocar o tipo do nosso provider, que o Nest vai criar uma inst\u00e2ncia do usersService para ser utilizada dentro do controller.<\/p>\n\n\n\n<p>Outro ponto extremamente importante, o Nest precisa ser informado sobre quais classes s\u00e3o providers, assim como controllers, entre outros. Dessa forma, ele consegue realizar todo o gerenciamento para Invers\u00e3o de Controle, Inje\u00e7\u00e3o de Depend\u00eancias, etc. Para isso, vamos entrar na \u00faltima etapa da arquitetura do Nest, os modules.&nbsp;<\/p>\n\n\n\n<p>Os modules s\u00e3o utilizados para registrar as classes da aplica\u00e7\u00e3o nas suas respectivas fun\u00e7\u00f5es e, dessa forma, o NestJS gera um grafo da aplica\u00e7\u00e3o, que \u00e9 a estrutura de dados usada para resolver as rela\u00e7\u00f5es e depend\u00eancias de modules e providers. Para nosso exemplo podemos ter o seguinte usersModule:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>import { Module } from '@nestjs\/common';\nimport { UsersService } from '.\/users.service';\nimport { UsersController } from '.\/users.controller';\n\n\n@Module({\ncontrollers: &#091;UsersController],\nproviders: &#091;UsersService]\n})\nexport class UsersModule {}\n<\/strong><\/code><\/pre>\n\n\n\n<p>Como podemos ver, os modules s\u00e3o reconhecidos pelo decorator @Module, onde pode-se tamb\u00e9m definir toda sua estrutura. Essa estrutura pode variar bastante dependendo da configura\u00e7\u00e3o e complexidade do seu projeto, mas os modules s\u00e3o constitu\u00eddos por 4 propriedades b\u00e1sicas: controllers, providers, imports e exports.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Controllers: um array de controllers para todas as inst\u00e2ncias de controllers do module criado;<\/li>\n\n\n\n<li>Providers: Um array de providers que ser\u00e3o instanciados pelo injetor do Nest;<\/li>\n\n\n\n<li>Imports: Um array de modules que s\u00e3o importados para uso nesse module, por exemplo, poder\u00edamos ter um m\u00f3dulo com uma conex\u00e3o com o banco de dados, logo eu poderia importar esse m\u00f3dulo;<\/li>\n\n\n\n<li>Exports: Um array de providers que ser\u00e3o disponibilizados para outros m\u00f3dulos utilizarem, por exemplo, poder\u00edamos disponibilizar o usersService para outros m\u00f3dulos terem acesso aos seus m\u00e9todos.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclus\u00e3o<\/strong><\/h2>\n\n\n\n<p>Com isso, vimos que com o NestJS \u00e9 poss\u00edvel criar aplica\u00e7\u00f5es com uma arquitetura modular, bem organizada e escal\u00e1vel. No entanto, esse texto \u00e9 somente uma introdu\u00e7\u00e3o aos conceitos do Nest, ent\u00e3o voc\u00ea deve estudar e aplicar em projetos para conseguir ter total entendimento dessa ferramenta poderosa. Para isso, vou colocar uma lista dos comandos do NestJS que ajudar\u00e3o na produtividade do desenvolvimento e um artigo do Angular extremamente \u00fatil para melhor entendimento sobre Invers\u00e3o de Controle e Inje\u00e7\u00e3o de Depend\u00eancias, que s\u00e3o conceitos fundamentais para utilizar o NestJS na melhor forma. Obrigado, at\u00e9 a pr\u00f3xima.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Refer\u00eancias<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.nestjs.com\/\">Documenta\u00e7\u00e3o do NestJS<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.nestjs.com\/cli\/usages\">Nest CLI Commands<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/angular.io\/guide\/dependency-injection\">Understanding Dependency Injection<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Ol\u00e1 Pessoal! Nesta edi\u00e7\u00e3o do PET Reda\u00e7\u00e3o, vamos entender mais sobre um framework que vem fazendo muito sucesso no desenvolvimento server-side em Node.js, o NestJS. Introdu\u00e7\u00e3o O Nest \u00e9 um framework Node.js para implementar aplica\u00e7\u00f5es backend eficientes, confi\u00e1veis e escal\u00e1veis utilizando Typescript (padr\u00e3o) ou Javascript. Constru\u00eddo em Typescript, ele utiliza diversos princ\u00edpios, como Programa\u00e7\u00e3o Orientada [&hellip;]<\/p>\n","protected":false},"author":6030,"featured_media":3438,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[124,112],"tags":[203,149,192],"class_list":["post-3408","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-destaques","category-redacao","tag-frameworks","tag-redacao","tag-web-e-front-end"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts\/3408","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/users\/6030"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/comments?post=3408"}],"version-history":[{"count":0,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/posts\/3408\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/media\/3438"}],"wp:attachment":[{"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/media?parent=3408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/categories?post=3408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ufsm.br\/pet\/sistemas-de-informacao\/wp-json\/wp\/v2\/tags?post=3408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}