Introducción a NestJS: ¿Por qué elegir este framework?
NestJS es un framework progresivo para Node.js que utiliza TypeScript por defecto y está construido sobre Express.js. Su arquitectura modular y su fuerte tipado lo convierten en una excelente opción para desarrollar aplicaciones backend escalables y mantenibles.
Entre sus principales ventajas destacan:
- Arquitectura modular: Organiza tu código de forma clara y reutilizable
- Inyección de dependencias: Facilita el testing y la mantenibilidad
- TypeScript nativo: Mayor seguridad en el desarrollo
- Ecosistema robusto: Amplia comunidad y documentación
Configuración inicial del entorno
Antes de comenzar, asegúrate de tener Node.js instalado en tu sistema. Puedes verificar la versión ejecutando:
node --version
npm --version
Instalación de la CLI de NestJS
La CLI (Command Line Interface) de NestJS es la herramienta principal para crear y gestionar proyectos. Instálala globalmente con npm:
npm install -g @nestjs/cli
Creando tu primer proyecto NestJS
Paso 1: Generar el proyecto base
Ejecuta el siguiente comando para crear un nuevo proyecto:
nest new mi-proyecto-nest
La CLI te preguntará qué gestor de paquetes prefieres (npm, yarn o pnpm). Selecciona el que más te guste.
Paso 2: Estructura del proyecto generado
Una vez completada la instalación, verás la siguiente estructura de archivos:
mi-proyecto-nest/
├── src/
│ ├── app.controller.ts
│ ├── app.controller.spec.ts
│ ├── app.module.ts
│ ├── app.service.ts
│ └── main.ts
├── test/
├── nest-cli.json
├── package.json
├── tsconfig.json
└── README.md
Paso 3: Ejecutar el servidor de desarrollo
Navega al directorio del proyecto y ejecuta:
cd mi-proyecto-nest
npm run start:dev
El servidor se ejecutará en http://localhost:3000. Puedes verificar que funciona visitando esta URL en tu navegador.
Entendiendo la estructura básica de NestJS
El archivo principal: main.ts
Este es el punto de entrada de la aplicación:
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
Módulos en NestJS
Los módulos son la base de la organización en NestJS. Aquí tienes el módulo principal generado:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
Creando tu primer controlador
Los controladores manejan las solicitudes HTTP. Vamos a crear uno básico:
import { Controller, Get } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get()
findAll(): string {
return 'Este endpoint devuelve todos los usuarios';
}
@Get(':id')
findOne(@Param('id') id: string): string {
return `Este endpoint devuelve el usuario con ID: ${id}`;
}
}
Implementando servicios
Los servicios contienen la lógica de negocio. Aquí tienes un ejemplo:
import { Injectable } from '@nestjs/common';
export interface User {
id: number;
name: string;
email: string;
}
@Injectable()
export class UsersService {
private readonly users: User[] = [
{ id: 1, name: 'Juan Pérez', email: 'juan@example.com' },
{ id: 2, name: 'María García', email: 'maria@example.com' },
];
findAll(): User[] {
return this.users;
}
findOne(id: number): User | undefined {
return this.users.find(user => user.id === id);
}
}
Organizando el proyecto: Módulos funcionales
Creando un módulo de usuarios
Usa la CLI para generar un módulo completo:
nest generate module users
nest generate controller users
nest generate service users
O en un solo comando:
nest generate resource users
Estructura del módulo de usuarios
// users/users.module.ts
import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';
@Module({
controllers: [UsersController],
providers: [UsersService],
exports: [UsersService], // Para usar en otros módulos
})
export class UsersModule {}
Buenas prácticas y consejos para proyectos NestJS
Organización de archivos
- Mantén una estructura modular: Cada funcionalidad en su propio módulo
- Usa DTOs (Data Transfer Objects): Para validación y tipado de datos
- Separa responsabilidades: Controladores solo para HTTP, servicios para lógica
Ejemplo de DTO para usuarios
// users/dto/create-user.dto.ts
export class CreateUserDto {
readonly name: string;
readonly email: string;
readonly password: string;
}
// users/dto/update-user.dto.ts
import { PartialType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';
export class UpdateUserDto extends PartialType(CreateUserDto) {}
Configuración y variables de entorno
Usa el módulo @nestjs/config para gestionar configuraciones:
npm install @nestjs/config
// app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
}),
// otros módulos...
],
})
export class AppModule {}
Testing desde el principio
NestJS incluye Jest configurado para testing. Ejecuta los tests con:
npm run test
npm run test:watch # Para desarrollo
npm run test:cov # Para cobertura
Próximos pasos
Una vez que tengas tu proyecto base funcionando, considera explorar:
- Bases de datos: Integración con TypeORM, Prisma o Mongoose
- Autenticación: JWT, Passport.js
- Documentación: Swagger/OpenAPI integrado
- Validación: Class-validator y class-transformer
NestJS ofrece una base sólida para construir aplicaciones backend modernas y escalables. Su arquitectura modular y su fuerte tipado te ayudarán a mantener un código limpio y mantenible a medida que tu aplicación crece.
Recursos útiles:
0 comentarios