Conceptos básicos de NestJS
10 ejemplos para entender el modelo mental de NestJS 11: 7 básicos y 3 intermedios.
Busca en todas las páginas de la documentación
10 ejemplos para entender el modelo mental de NestJS 11: 7 básicos y 3 intermedios.
npm i -g @nestjs/cli@11
nest new my-api --strict
cd my-api
npm pkg set type=modulePara patrones de DI y aspectos transversales, consulta Inyección de dependencias y Guards, Interceptors y 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 y proveedores relacionados@Injectable marca una clase para DI@Controller define el prefijo de la ruta; los métodos definen los 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") extrae parámetros de ruta@Body() extrae el cuerpo de la solicitud (analizado por el adaptador subyacente)// 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 es la raíz; importa módulos de característicasNestFactory.create inicializa el contenedor de DINestFactory.create(AppModule, new FastifyAdapter()) para rendimientoasync 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 elimina propiedades desconocidastransform: true convierte objetos planos en instancias de clases DTOclass-validator y 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) se aplica a excepciones 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 carga archivos .envConfigService inyecta valores de entornoimport { 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 puede inyectar UsersServiceexports hace que los proveedores estén disponibles para los módulos importadoresexports, los proveedores son privados del móduloimport { Injectable, OnModuleInit, OnModuleDestroy } from "@nestjs/common";
@Injectable()
export class DatabaseService implements OnModuleInit, OnModuleDestroy {
async onModuleInit() {
console.log("Conectando a la base de datos...");
}
async onModuleDestroy() {
console.log("Cerrando conexiones a la base de datos...");
}
}onModuleInit se ejecuta después de que se resuelven las dependencias del móduloonModuleDestroy se ejecuta en el cierre eleganteNestJS cuando necesites DI, arquitectura modular, guards/interceptors y patrones de microservicios. Fastify para APIs ligeras. Consulta Lista de verificación para la selección de frameworks.
Sí. NestJS 11 es compatible con los adaptadores Express 5 y Fastify 5 en Node 24 LTS.
Muy recomendable. NestJS está impulsado por decoradores y diseñado para TypeScript. JavaScript funciona, pero pierde la seguridad de tipos.
Modelo mental similar: módulos, DI, decoradores, guards. NestJS es el equivalente más cercano en Node.
Sí, con "type": "module" y extensiones .js en las importaciones. Consulta la documentación de NestJS 11 ESM para conocer el estado actual de la compatibilidad.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026