Destrinchando o NestJS: do zero ao primeiro endpoint
### Se você sempre quis aprender **NestJS** mas não sabia por onde começar, esse guia é para você!
### Vamos passo a passo entender os fundamentos e colocar a mão na massa até termos nossa primeira API rodando.
---
## 1️⃣ Instalação do NestJS CLI
### 👉 Comando mágico para instalar a CLI:
```
npm i -g @nestjs/cli
```
---
## 2️⃣ Criação do projeto
```
nest new meu-projeto
```
### 📂 **Estrutura do projeto:**
```
📂 meu-projeto
├── 📁 src
│ ├── 📁 users
│ │ ├── users.controller.ts
│ │ ├── users.service.ts
│ │ └── users.module.ts
│ ├── app.module.ts
│ ├── app.controller.ts
│ ├── app.service.ts
│ └── main.ts
├── .env
├── package.json
└── tsconfig.json
```
---
## 3️⃣ Utilizando a CLI para gerar atributos
```
nest generate module users
nest generate service users
nest generate controller users
```
---
## 4️⃣ Entendendo os Módulos
### 📦 Conceito Fundamental
#### Os **módulos** no NestJS são a unidade organizacional fundamental do framework, representando um mecanismo de encapsulamento e organização que define como os componentes da aplicação se relacionam e interagem entre si.
### 🧩 Definição Conceitual
#### Um módulo no NestJS é essencialmente um **contêiner lógico** que agrupa funcionalidades relacionadas, fornecendo um contexto isolado onde providers, controllers, middlewares e outros elementos podem ser organizados de forma coesa.
### ⚙️ Características Teóricas Fundamentais
#### 1. Encapsulamento
Os módulos criam fronteiras bem definidas entre diferentes partes da aplicação, permitindo que cada módulo mantenha sua própria responsabilidade.
#### 2. Injeção de Dependência Contextualizada
Cada módulo possui seu próprio contexto de injeção de dependência, onde os providers são registrados e podem ser compartilhados.
#### 3. Composição Hierárquica
Os módulos seguem uma estrutura hierárquica onde existe um módulo raiz (root module) que importa outros módulos.
### 🏗️ Elementos Estruturais
#### Decorator @Module()
Cada módulo é definido através do decorator `@Module()`, que aceita:
- **imports**: Define quais outros módulos são necessários
- **controllers**: Especifica os controladores que pertencem ao módulo
- **providers**: Lista os provedores de serviços disponíveis no módulo
- **exports**: Determina quais providers podem ser utilizados por outros módulos
---
## 5️⃣ O que é Injeção de Dependência
### 👉 Conceito que ajuda a manter o código organizado, escalável e fácil de testar.
> "A injeção de dependência é um padrão que permite que objetos recebam suas dependências de fontes externas, ao invés de criá-las internamente."
---
## 6️⃣ Entendendo o Lifecycle do NestJS
#### O ciclo de vida define como o Nest lida com instâncias, inicialização e destruição.
**Principais hooks do lifecycle:**
- `onModuleInit()`
- `onApplicationBootstrap()`
- `onModuleDestroy()`
- `beforeApplicationShutdown()`
---
## 7️⃣ Entendendo os Controllers
### 🎯 São os pontos de entrada da sua API.
### Responsáveis por:
- Receber requisições HTTP
- Validar dados de entrada
- Chamar os services apropriados
- Retornar respostas formatadas
---
## 8️⃣ Entendendo os Services
### 🧠 Aqui fica a lógica de negócio.
### Responsabilidades:
- Implementar regras de negócio
- Interagir com banco de dados
- Processar dados
- Comunicação com APIs externas
---
## 9️⃣ Expondo nossas portas
#### 🌐 Por padrão, o NestJS roda em `http://localhost:3000`.
#### Para alterar a porta, modifique o arquivo `main.ts`:
```
const port = process.env.PORT || 3000;
await app.listen(port);
```
---
## 🔟 O que é .env
#### 📄 Arquivo para gerenciar variáveis de ambiente.
Exemplo de `.env`:
```
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
JWT_SECRET=minha-chave-secreta
PORT=3000
```
---
## 1️⃣1️⃣ Usando o .env com o ConfigModule do NestJS
#### Exemplo de implementação:
```
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [ConfigModule.forRoot()],
})
export class AppModule {}
```
---
## 1️⃣3️⃣ Considerações finais
#### 🎉 Você agora já tem a base para construir APIs poderosas com NestJS!
**Próximos passos:**
- Implementar autenticação
- Conectar com banco de dados
- Adicionar validações
- Escrever testes
> "O NestJS combina o melhor do TypeScript com padrões arquiteturais sólidos para criar aplicações robustas e escaláveis."
---
**Compartilhe este guia com outros desenvolvedores!** 🚀