Pular para conteúdo

NestJS

TLDR: NestJS é um framework Node.js/TypeScript que organiza a aplicação em módulos, controllers e providers, e processa toda requisição por uma esteira fixa de etapas (middleware, guard, pipe, controller, interceptor, filter).

Termo Vá pra
Module, Controller, Provider, Resolver Building blocks
A esteira que toda requisição atravessa Pipeline de uma requisição
Como o framework resolve dependências Dependency injection

NestJS é um framework para construir aplicações server-side em TypeScript. Ele fornece uma estrutura opinada pra organizar código, gerenciar dependências e lidar com requisições HTTP e GraphQL, na mesma linha de frameworks como Spring (Java) ou Django (Python): convenção sobre configuração, decorators pra declarar intenção, um container de injeção de dependência central.

Building blocks

flowchart TD
    MOD["Module\nagrupa e organiza"]
    CTRL["Controller\nrecebe requisições"]
    PROV["Provider / Service\nlógica injetável"]

    MOD --> CTRL
    MOD --> PROV
    CTRL -.-> PROV
Conceito O que é
Module Unidade organizacional que agrupa controllers e providers. Toda aplicação NestJS tem um module raiz que importa os demais.
Controller Classe que recebe requisições HTTP e delega pra providers, via decorators como @Controller(), @Get(), @Post(), @Body(), @Param().
Provider Qualquer classe injetável no container de DI: services, repositórios, handlers, configs.
Resolver O equivalente do controller pra GraphQL, com @Resolver(), @Query(), @Mutation().

Pipeline de uma requisição

Uma requisição não vai direto ao controller, ela passa por uma esteira de etapas, cada uma com um papel específico:

flowchart LR
    REQ["Requisição"] --> MW["Middleware"]
    MW --> GD["Guard"]
    GD --> PP["Pipe"]
    PP --> CTRL["Controller"]
    CTRL --> IT["Interceptor"]
    IT --> RESP["Resposta"]
    IT -.->|erro| FT["Filter"]
    FT --> RESP
  • Middleware executa antes de tudo, pode modificar requisição ou resposta.
  • Guard decide se a requisição pode prosseguir, é onde autenticação e autorização de rota acontecem.
  • Pipe transforma e valida os dados de entrada.
  • Interceptor envolve a execução do handler, atua antes e depois da lógica principal.
  • Filter captura erro lançado em qualquer etapa e formata uma resposta padronizada.

Dependency injection

Dependency injection (DI, injeção de dependência) é um padrão onde uma classe não cria suas próprias dependências, ela declara "preciso de X" e o framework fornece X automaticamente, resolvido via constructor. Isso é o que torna a inversão de dependência da arquitetura hexagonal viável na prática: o código de alto nível declara o contrato que precisa, o container resolve qual implementação concreta entregar.

O NestJS usa tokens de injeção pra saber qual implementação entregar quando o contrato é uma interface TypeScript (que não existe mais em tempo de execução, já que TypeScript compila pra JavaScript puro). Um token pode ser uma classe, uma string, ou um Symbol, esse último é útil justamente porque garante um identificador único sem colisão de nome.

Pra ir além

A documentação oficial do NestJS cobre os building blocks e o pipeline de requisição em detalhe, incluindo os pontos de extensão (custom decorators, exception filters, custom pipes) que um projeto real geralmente precisa além do básico.