36. Servicios
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.
Servicios en NestJS: Organizando la Lógica de Negocio
En NestJS, los servicios son una parte fundamental para estructurar nuestra aplicación de manera limpia y mantenible. Estos se encargan de alojar la lógica de negocio, haciéndola reutilizable mediante inyección de dependencias.
¿Qué es un Servicio?
Un servicio es una clase decorada con @Injectable(), lo que permite que NestJS lo inyecte en controladores u otros servicios. Su principal función es manejar operaciones como:
Consultar datos.
Insertar, actualizar o eliminar registros.
Realizar cálculos o validaciones complejas.
Por ejemplo, si tenemos un PeliculasService, este se encargaría de gestionar toda la lógica relacionada con películas: búsqueda, creación, modificación, etc.
Diferencia entre Providers y Servicios
Todos los servicios son providers, pero no todos los providers son servicios.
Los providers son clases que pueden inyectarse (como repositorios, factories, helpers).
Los servicios son un tipo específico de provider que contiene lógica de negocio.
Ejemplo Práctico: Moviendo la Lógica a un Servicio
Imaginemos que tenemos un controlador CarsController con datos en memoria:
@Controller('cars')
export class CarsController {
private cars = ['Toyota', 'Honda', 'Jeep'];
@Get()
getAllCars() {
return this.cars;
}
@Get(':id')
getCarById(@Param('id') id: string) {
return this.cars[id];
}
}Paso 1: Crear el Servicio
Usamos el CLI de NestJS para generar el servicio:
nest g s cars --no-specEsto crea cars.service.ts y actualiza cars.module.ts automáticamente.
Paso 2: Mover la Lógica al Servicio
import { Injectable } from '@nestjs/common';
@Injectable()
export class CarsService {
private cars = [
{ id: 1, brand: 'Toyota', model: 'Corolla' },
{ id: 2, brand: 'Honda', model: 'Civic' },
{ id: 3, brand: 'Jeep', model: 'Cherokee' },
];
}Paso 3: Inyectar el Servicio en el Controlador
Ahora, el controlador delega las operaciones al servicio:
@Controller('cars')
export class CarsController {
constructor(private readonly carsService: CarsService) {}
@Get()
getAllCars() {
return this.carsService.getAllCars();
}
@Get(':id')
getCarById(@Param('id') id: string) {
return this.carsService.getCarById(+id);
}
}Paso 4: Registrar el Servicio en el Módulo
NestJS automáticamente lo agrega en providers:
import { Module } from '@nestjs/common';
import { CarsController } from './cars.controller';
import { CarsService } from './cars.service';
@Module({
controllers: [CarsController],
providers: [CarsService],
})
export class CarsModule {}Beneficios de Usar Servicios
✅ Reutilización de código: La lógica puede usarse en múltiples controladores.
✅ Mantenibilidad: Separación clara entre rutas (controladores) y reglas de negocio (servicios).
✅ Testeabilidad: Fácil de mockear en pruebas unitarias.
Conclusión
Los servicios en NestJS son esenciales para mantener una arquitectura limpia y escalable. Al centralizar la lógica de negocio, evitamos repetir código y facilitamos futuras modificaciones.
¿Ya has implementado servicios en tus proyectos con NestJS? ¡Cuéntame tu experiencia en los comentarios! 🚀
📌 ¿Quieres aprender más? En el próximo post, exploraremos inyección de dependencias a profundidad. ¡No te lo pierdas!
Comentarios
Publicar un comentario