36. Servicios

 directorios que se están usando en el ejemplo:

Copy
Download
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:

typescript
Copy
Download
@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:

bash
Copy
Download
nest g s cars --no-spec

Esto crea cars.service.ts y actualiza cars.module.ts automáticamente.

import { Module } from '@nestjs/common';
import { CarsController } from './cars.controller';
import { CarsService } from './cars.service';

@Module({
  controllers: [ CarsController ],
  providers: [CarsService],
})
export class CarsModule {}


Paso 2: Mover la Lógica al Servicio

typescript
Copy
Download
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:

typescript
Copy
Download
@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:

typescript
Copy
Download
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

Entradas más populares de este blog

48. ValidationPipe - Class Validator y Class Transformer

32-Modulos

49. Pipes Globales - A nivel de Aplicación