NestJS Cheatsheet: Comandos y Conceptos Esenciales
Guía rápida con los comandos y conceptos fundamentales de NestJS para desarrollo backend escalable con Node.js.
NestJS es un framework progresivo de Node.js para construir aplicaciones backend escalables. Esta guía recopila los comandos y conceptos más importantes que necesitas conocer para trabajar eficientemente con NestJS.
Instalación y Configuración Inicial
Primero, instala el CLI de NestJS globalmente y crea un nuevo proyecto:
1# Instalar CLI globalmente
2npm i -g @nestjs/cli
3
4# Crear nuevo proyecto
5nest new project-name
6
7# Navegar al proyecto
8cd project-name
9
10# Iniciar en modo desarrollo
11npm run start:devComandos del CLI
El CLI de NestJS incluye comandos para generar automáticamente componentes. Puedes usar nest generate o su atajo nest g:
1# Crear módulo
2nest g mo users
3
4# Crear controlador
5nest g co users
6
7# Crear servicio
8nest g s users
9
10# Crear un recurso completo (módulo, controlador, servicio, DTO)
11nest g resource products
12
13# Ver ayuda de cualquier comando
14nest g s -h
15
16# Dry-run (ver qué archivos se crearán sin crearlos)
17nest g s users --dry-run
18
19# Crear sin archivo de tests
20nest g s users --no-specDecoradores HTTP
Los decoradores son fundamentales en NestJS. Aquí los más comunes para manejar peticiones HTTP:
1import { Controller, Get, Post, Put, Patch, Delete, Param, Body, Query } from '@nestjs/common';
2
3@Controller('products')
4export class ProductsController {
5 // GET /products
6 @Get()
7 findAll() {
8 return 'Obtener todos los productos';
9 }
10
11 // GET /products/:id
12 @Get(':id')
13 findOne(@Param('id') id: string) {
14 return `Producto #${id}`;
15 }
16
17 // POST /products
18 @Post()
19 create(@Body() body: any) {
20 return 'Crear producto';
21 }
22
23 // PUT /products/:id
24 @Put(':id')
25 update(@Param('id') id: string, @Body() body: any) {
26 return `Actualizar producto #${id}`;
27 }
28
29 // DELETE /products/:id
30 @Delete(':id')
31 remove(@Param('id') id: string) {
32 return `Eliminar producto #${id}`;
33 }
34
35 // Query parameters: GET /products/search?name=laptop&min=100
36 @Get('search')
37 search(@Query('name') name: string, @Query('min') min: string) {
38 return `Buscar: ${name}, precio mínimo: ${min}`;
39 }
40}Validación con Class Validator
Instala las dependencias necesarias para validación de datos:
1npm i class-validator class-transformerConfigura el ValidationPipe globalmente en tu archivo main.ts:
1import { ValidationPipe } from '@nestjs/common';
2
3async function bootstrap() {
4 const app = await NestFactory.create(AppModule);
5
6 app.useGlobalPipes(
7 new ValidationPipe({
8 whitelist: true, // Remueve propiedades no definidas en el DTO
9 forbidNonWhitelisted: true, // Lanza error si hay propiedades extra
10 transform: true, // Transforma payloads a instancias de DTO
11 })
12 );
13
14 await app.listen(3000);
15}
16bootstrap();Ejemplo de DTO con decoradores de validación:
1import { IsString, IsNumber, IsPositive, IsOptional, IsEmail, IsUrl } from 'class-validator';
2
3export class CreateProductDto {
4 @IsString()
5 name: string;
6
7 @IsNumber()
8 @IsPositive()
9 price: number;
10
11 @IsString()
12 @IsOptional()
13 description?: string;
14
15 @IsEmail()
16 @IsOptional()
17 contactEmail?: string;
18}Decoradores de Class Validator más usados
- @IsString() - Valida que sea texto
- @IsNumber() - Valida que sea número
- @IsBoolean() - Valida que sea booleano
- @IsEmail() - Valida formato de email
- @IsUrl() - Valida formato de URL
- @IsUUID() - Valida formato UUID
- @IsMongoId() - Valida ID de MongoDB
- @IsPositive() - Valida número positivo
- @IsArray() - Valida que sea array
- @IsOptional() - Hace el campo opcional
- @IsDate() - Valida objeto Date
- @IsDateString() - Valida string de fecha ISO
Pipes integrados
NestJS incluye pipes útiles para transformar y validar datos:
1import { ParseIntPipe, ParseUUIDPipe, ParseBoolPipe } from '@nestjs/common';
2
3@Get(':id')
4findOne(
5 @Param('id', ParseIntPipe) id: number // Convierte string a number
6) {
7 return this.productsService.findOne(id);
8}
9
10@Get('uuid/:id')
11findByUuid(
12 @Param('id', ParseUUIDPipe) id: string // Valida formato UUID
13) {
14 return this.productsService.findByUuid(id);
15}
16
17@Get('active')
18findActive(
19 @Query('isActive', ParseBoolPipe) isActive: boolean // Convierte a boolean
20) {
21 return this.productsService.findActive(isActive);
22}Excepciones HTTP comunes
1import {
2 NotFoundException,
3 BadRequestException,
4 UnauthorizedException,
5 ForbiddenException,
6 InternalServerErrorException
7} from '@nestjs/common';
8
9@Get(':id')
10async findOne(@Param('id', ParseIntPipe) id: number) {
11 const product = await this.productsService.findOne(id);
12
13 if (!product) {
14 throw new NotFoundException(`Producto #${id} no encontrado`);
15 }
16
17 return product;
18}Estructura de módulo recomendada
1src/
2├── common/
3│ ├── decorators/
4│ ├── dtos/
5│ ├── filters/
6│ ├── guards/
7│ ├── interceptors/
8│ ├── middleware/
9│ └── pipes/
10├── users/
11│ ├── dto/
12│ │ ├── create-user.dto.ts
13│ │ └── update-user.dto.ts
14│ ├── entities/
15│ │ └── user.entity.ts
16│ ├── users.controller.ts
17│ ├── users.service.ts
18│ └── users.module.ts
19└── main.tsRecursos adicionales
Si quieres profundizar más en NestJS, te recomiendo estos recursos:
Curso completo de NestJS por Fernando Herrera en UdemyDocumentación oficial de NestJSGuía de comandos y conceptos fundamentales sobre NestJS - (Fernando Herrera)