33. Controladores
directorios que se están usando en el ejemplo:
src/
│
├── cars/
│ ├── cars.controller.ts # Controlador (maneja las rutas HTTP)
│ ├── cars.module.ts # Módulo (registra controlador y servicio)
│ └── cars.service.ts # Servicio (lógica de negocio)
│
├── app.module.ts # Módulo principal de la aplicación
└── main.ts # Punto de entrada (configuración de NestJS)Explicación breve:
cars/: Contiene los archivos específicos del recurso Cars (controlador, módulo y servicio).app.module.ts: Importa y organiza los módulos de la aplicación (en este caso,CarsModule).main.ts: Inicia la aplicación y configura el servidor.
Esta estructura sigue las buenas prácticas de NestJS, separando responsabilidades en capas claras.
Controladores en NestJS: Manejo de Rutas y Solicitudes
En la lección anterior exploramos los módulos en NestJS, que son clases decoradas con @Module(). Lo fascinante de NestJS es cómo los decoradores transforman clases simples en elementos con funcionalidad específica, como módulos, servicios o controladores.
Hoy nos enfocaremos en los controladores, piezas clave para manejar las rutas de una aplicación NestJS.
¿Qué es un Controlador?
Un controlador es una clase con el decorador @Controller(), responsable de:
Escuchar solicitudes HTTP (GET, POST, etc.).
Emitir respuestas al cliente (como datos JSON o códigos de estado).
Sin controladores, NestJS devuelve un error 404 para rutas no manejadas, ya que no hay lógica definida para responder.
Creando un Controlador
NestJS ofrece comandos CLI para generar componentes automáticamente. Para crear un controlador, ejecutamos:
bash
nest generate controller cars
# o su alias:
nest g co cars
Esto creará:
Un archivo cars.controller.ts (con el decorador @Controller('cars')).
Actualizará el módulo asociado (en este caso, CarsModule) para registrar el controlador.
import { Module } from '@nestjs/common';import { CarsController } from './cars.controller';import { CarsService } from './cars.service';
@Module({ controllers: [ CarsController ], providers: [CarsService],})export class CarsModule {}
src/
│
├── cars/
│ ├── cars.controller.ts # Controlador (maneja las rutas HTTP)
│ ├── cars.module.ts # Módulo (registra controlador y servicio)
│ └── cars.service.ts # Servicio (lógica de negocio)
│
├── app.module.ts # Módulo principal de la aplicación
└── main.ts # Punto de entrada (configuración de NestJS)Estructura Básica
cars.controller.ts
import { Controller, Get } from '@nestjs/common';
@Controller('cars')
export class CarsController {
@Get()
getAll() {
return ['Toyota', 'Honda', 'Jeep'];
}
}
@Controller('cars'): Define la ruta base /cars.
@Get(): Maneja solicitudes GET a la ruta base. Al acceder a localhost:3000/cars, NestJS ejecutará getAll() y devolverá el array.
Flujo de un Controlador
Cliente hace una petición: Por ejemplo, GET /cars.
NestJS enruta la solicitud al método decorado con @Get().
El controlador procesa la solicitud y devuelve una respuesta (con status 200 por defecto).
Diagrama de flujo: Cliente → Controlador → Respuesta
Buenas Prácticas
Organización por módulos:
Los controladores deben agruparse en módulos (como CarsModule).
Evita crear archivos sueltos en la raíz del proyecto.
Usar la CLI:
Genera automáticamente archivos y actualiza dependencias.
Alternativas: nest g module, nest g service.
Decoradores específicos:
@Post(), @Put(), @Delete() para otros métodos HTTP.
Personaliza respuestas con @HttpCode() o @Header().
Conclusión
Los controladores son el "cerebro" de las rutas en NestJS, combinando simplicidad (clases TypeScript) y potencia (decoradores). En próximas lecciones, ajustaremos configuraciones de ESLint para mejorar la experiencia de desarrollo y profundizaremos en parámetros de rutas (@Param(), @Body()).
_________________________________________________________________________
Controladores en NestJS: Manejo de Rutas con Decoradores
En la clase anterior exploramos los módulos en NestJS: simples clases decoradas con @Module(). Lo fascinante de NestJS es cómo los decoradores transforman clases en objetos con funcionalidad específica, lo que hace el framework increíblemente poderoso.
¿Qué pasa si no hay controladores?
Si hacemos una petición a la ruta raíz (/) de nuestra aplicación y no existe un controlador que la maneje, NestJS responderá automáticamente con un error 404 (Not Found), ya que no hay lógica definida para procesar la solicitud.
Creando un Módulo y su Controlador
1. Generar el Módulo
Ejecutamos el siguiente comando en la terminal:
bash
nest g mo cars
Esto genera:
Una carpeta cars con un archivo cars.module.ts.
Una clase decorada con @Module() (si eliminas el decorador, es una clase TypeScript normal).
Una actualización automática en app.module.ts para importar el nuevo módulo.
2. Crear el Controlador
Ahora, generamos el controlador asociado al módulo:
bash
nest g co cars
Este comando:
Crea el archivo cars.controller.ts (con su decorador @Controller('cars')).
Genera un archivo de pruebas (*.spec.ts).
Actualiza cars.module.ts (no app.module.ts) porque NestJS detecta que el controlador pertenece a este módulo específico.
Anatomía de un Controlador
Al abrir cars.controller.ts, encontramos:
typescript
import { Controller, Get } from '@nestjs/common';
@Controller('cars') // Ruta base: '/cars'
export class CarsController {
@Get() // Maneja solicitudes GET a '/cars'
getAllCars() {
return ['Toyota', 'Honda', 'Jeep'];
}
}
¿Cómo funciona?
@Controller('cars'): Define que este controlador manejará rutas bajo /cars.
@Get(): Decorador que asocia el método getAllCars() a las peticiones GET a la ruta base (/cars).
Al acceder a http://localhost:3000/cars, NestJS ejecutará este método y devolverá el array de automóviles.
Flujo de una Solicitud
Cliente (Postman, navegador) envía GET /cars.
NestJS enruta la solicitud al controlador CarsController.
El método getAllCars() se ejecuta y devuelve los datos (con status 200 OK por defecto).
Conclusión
Los controladores son el corazón de las rutas en NestJS:
Escuchan solicitudes y emiten respuestas.
Se organizan en módulos para mantener el código limpio.
Usan decoradores (@Get, @Post, etc.) para definir su comportamiento.
🔗 Documentación oficial: NestJS Controllers
En la próxima lección, configuraremos ESLint para evitar errores de formato y exploraremos cómo manejar parámetros en rutas (@Param(), @Body()).
¿Qué tema te gustaría ver más detallado? ¡Déjalo en los comentarios! 🚀
Nota: Si usas Visual Studio Code, instala la extensión oficial de NestJS para aprovechar autocompletado y snippets.
Comentarios
Publicar un comentario