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:

Categorías: Sin categoría

0 comentarios

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *