Noções Básicas de NestJS
10 exemplos para entender o modelo mental do NestJS 11 - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para entender o modelo mental do NestJS 11 - 7 básicos e 3 intermediários.
npm i -g @nestjs/cli@11
nest new my-api --strict
cd my-api
npm pkg set type=modulePara padrões de DI e preocupações transversais, veja Injeção de Dependência e Guards, Interceptors & Pipes.
// users.module.ts
import { Module } from "@nestjs/common";
import { UsersController } from "./users.controller.js";
import { UsersService } from "./users.service.js";
@Module({
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}// users.service.ts
import { Injectable } from "@nestjs/common";
@Injectable()
export class UsersService {
findAll() {
return [{ id: 1, name: "Ada Lovelace" }];
}
}// users.controller.ts
import { Controller, Get } from "@nestjs/common";
import { UsersService } from "./users.service.js";
@Controller("users")
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get()
findAll() {
return this.usersService.findAll();
}
}@Module agrupa controladores e provedores relacionados@Injectable marca uma classe para DI@Controller define o prefixo da rota; métodos definem verbos HTTPimport { Controller, Get, Post, Body, Param } from "@nestjs/common";
@Controller("users")
export class UsersController {
@Get(":id")
findOne(@Param("id") id: string) {
return { id, name: "Ada" };
}
@Post()
create(@Body() body: { name: string; email: string }) {
return { id: "1", ...body };
}
}@Param("id") extrai parâmetros de rota@Body() extrai o corpo da requisição (parseado pelo adaptador subjacente)ValidationPipe para validação automática// app.module.ts
import { Module } from "@nestjs/common";
import { UsersModule } from "./users/users.module.js";
@Module({
imports: [UsersModule],
})
export class AppModule {}// main.ts
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module.js";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();AppModule é a raiz; importe módulos de funcionalidadeNestFactory.create inicializa o container de DINestFactory.create(AppModule, new FastifyAdapter()) para desempenhoasync function bootstrap() {
const app = await NestFactory.create(AppModule);
app.setGlobalPrefix("api/v1");
await app.listen(3000);
}/api/v1setGlobalPrefix("api", { exclude: ["health"] })import { ValidationPipe } from "@nestjs/common";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));
await app.listen(3000);
}import { IsEmail, IsString, MinLength } from "class-validator";
export class CreateUserDto {
@IsString()
@MinLength(1)
name!: string;
@IsEmail()
email!: string;
}whitelist: true remove propriedades desconhecidastransform: true converte objetos simples em instâncias de classe DTOclass-validator e class-transformerimport { ExceptionFilter, Catch, ArgumentsHost, HttpException } from "@nestjs/common";
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const status = exception.getStatus();
response.status(status).json(exception.getResponse());
}
}@Catch(HttpException) limita a exceções HTTPimport { Module } from "@nestjs/common";
import { ConfigModule } from "@nestjs/config";
@Module({
imports: [ConfigModule.forRoot({ isGlobal: true })],
})
export class AppModule {}import { Injectable } from "@nestjs/common";
import { ConfigService } from "@nestjs/config";
@Injectable()
export class AppService {
constructor(private config: ConfigService) {}
getPort() {
return this.config.get<number>("PORT", 3000);
}
}@nestjs/config carrega arquivos .envConfigService injeta valores de ambienteimport { NestFactory } from "@nestjs/core";
import { FastifyAdapter, NestFastifyApplication } from "@nestjs/platform-fastify";
import { AppModule } from "./app.module.js";
async function bootstrap() {
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter({ logger: true })
);
await app.listen({ port: 3000, host: "0.0.0.0" });
}
bootstrap();@Module({
providers: [UsersService],
exports: [UsersService],
})
export class UsersModule {}
@Module({
imports: [UsersModule],
controllers: [OrdersController],
})
export class OrdersModule {}
// OrdersController pode injetar UsersServiceexports torna os provedores disponíveis para módulos importadoresexports, os provedores são privados ao móduloimport { Injectable, OnModuleInit, OnModuleDestroy } from "@nestjs/common";
@Injectable()
export class DatabaseService implements OnModuleInit, OnModuleDestroy {
async onModuleInit() {
console.log("Conectando ao banco de dados...");
}
async onModuleDestroy() {
console.log("Fechando conexões do banco de dados...");
}
}onModuleInit é executado após as dependências do módulo serem resolvidasonModuleDestroy é executado no desligamento graciosoNestJS quando você precisa de DI, arquitetura modular, guards/interceptors e padrões de microsserviços. Fastify para APIs enxutas. Veja Checklist de Seleção de Framework.
Sim. NestJS 11 suporta adaptadores Express 5 e Fastify 5 no Node 24 LTS.
Fortemente recomendado. NestJS é baseado em decorators e projetado para TypeScript. JavaScript funciona, mas perde a segurança de tipos.
Modelo mental semelhante: módulos, DI, decorators, guards. NestJS é o equivalente mais próximo no Node.
Sim, com "type": "module" e extensões .js nas importações. Verifique a documentação ESM do NestJS 11 para o status de suporte atual.
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026