🚀 Cap 06: Stack Enterprise TypeScript: NestJS (Clean Architecture) e Next.js App Router (SSR/RSC)
Arquitetura de Aplicações Full Stack
🗺️ Mapa Conceitual
flowchart LR
NAV["🌐 Navegador"] -->|"HTML pronto + ilhas interativas"| NEXT["▲ Next.js App Router<br/>Server · Client · Route Handlers"]
NEXT -->|"servidor → servidor"| NEST["🐈 NestJS<br/>Guard → Pipe → Controller → Service"]
NEST --> PG[("🐘 PostgreSQL")]
style NEXT fill:#e1f5fe,stroke:#03a9f4,stroke-width:2px
style NEST fill:#fce4ec,stroke:#e91e63,stroke-width:2px
🧩 O problema
- Express + React: liberdade demais para equipes grandes
- SPA entrega HTML vazio: “Carregando…” e SEO fraco
- NestJS impõe a estrutura da API; Next.js gera o HTML no servidor
🐈 NestJS em 3 peças
- Módulo: declara
controllerseproviders - Controller: as rotas (
@Get,@Post) - Service com
@Injectable(): a regra de negócio - Injeção pelo construtor: o controller declara, o Nest entrega
🛂 O caminho da requisição
| Etapa | Exemplo | Se falhar |
|---|---|---|
| Guard | PapeisGuard (ADMIN) |
403 |
| Pipe | ValidationPipe, ParseIntPipe |
400 |
| Service | NotFoundException |
404 |
🛡️ ValidationPipe
new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true })
- Regras no DTO (
@IsPositive(),@MinLength(3)) whitelist: bloqueia o mass assignment ("role": "ADMIN"no cadastro)- Todas as violações voltam juntas numa lista
▲ Server × Client Components
| Server (padrão) | Client ("use client") |
|
|---|---|---|
| Onde roda | Servidor | Navegador |
| Pode | async, fetch direto, segredos |
useState, onClick |
| Não pode | Estado, eventos | Segredos |
"use client" só nas folhas interativas.
🔐 Next.js como BFF
- Route Handler recebe o login e chama o NestJS
- JWT vai para cookie
HttpOnly: o JavaScript da página não lê middleware.tsredireciona/adminsem cookie para/login- O guard do NestJS continua obrigatório: a API pode ser chamada sem o Next
🔄 Next 14 → Next 15
cookies()eheaders()agora são assíncronosfetchnão entra em cache por padrão- Diga o que quer:
next: { revalidate: 60 }oucache: "no-store"
⚖️ Como cada página é gerada
| Modo | Pedido | Use para |
|---|---|---|
| SSG | cache: "force-cache" |
Institucional |
| ISR | next: { revalidate: N } |
Vitrine, blog |
| SSR | cache: "no-store" / cookies() |
Carrinho, área logada |
| CSR | Client Component + TanStack Query | Painéis interativos |
⚠️ Armadilhas
- Serviço fora dos
providers→ “Nest can’t resolve dependencies” na subida - Sem
@Injectable()+ dependências → sobe e quebra na 1ª chamada "use client"no layout → a página inteira vira JavaScriptrevalidatecom dados fixos no código → a página nunca muda
🗂️ No Catálogo
fullstack_tecloja_04_nest_nextjs(guia): Módulos 02, 03, 05 (NestJS), 06 (RSC) e 07 (BFF)- No código:
schema.prismareal;page.tsxcom produtos fixos erevalidateinútil fullstack_tecloja_03_nest_react:ProductsServicesem@Injectable(), base do exercício 06.1
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim