Servicios en NestJS
Conceptos Avanzados en NestJS
Voy a explicarte estos importantes conceptos de NestJS:
1. Servicios en NestJS
Los servicios son clases marcadas con el decorador @Injectable() que contienen la lógica de negocio de tu aplicación.
Características principales:
Son singletons por defecto (una sola instancia compartida)
Se encargan de la lógica de negocio (separada de los controladores)
Pueden ser inyectados en otros componentes (controladores, otros servicios)
Promueven el principio de responsabilidad única
Ejemplo básico:
import { Injectable } from '@nestjs/common'; @Injectable() export class CatsService { private readonly cats: Cat[] = []; create(cat: Cat) { this.cats.push(cat); } findAll(): Cat[] { return this.cats; } }
2. Archivo con todos los métodos (CRUD Service)
Es común crear servicios que implementen todas las operaciones CRUD para una entidad:
import { Injectable } from '@nestjs/common'; import { Cat } from './cat.entity'; @Injectable() export class CatsService { private cats: Cat[] = []; // Create create(cat: Cat): Cat { this.cats.push(cat); return cat; } // Read findAll(): Cat[] { return this.cats; } findOne(id: number): Cat { return this.cats.find(cat => cat.id === id); } // Update update(id: number, updatedCat: Cat): Cat { const index = this.cats.findIndex(cat => cat.id === id); this.cats[index] = updatedCat; return updatedCat; } // Delete remove(id: number): void { this.cats = this.cats.filter(cat => cat.id !== id); } }
3. Entidades
Las entidades representan tablas en tu base de datos (en el contexto de TypeORM). Son clases decoradas que definen la estructura de tus datos.
Ejemplo con TypeORM:
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; @Entity() export class Cat { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column() age: number; @Column() breed: string; }
4. Servicios y Repository Pattern
El Repository Pattern es un patrón de diseño que:
Abstrae el acceso a datos
Centraliza las operaciones de base de datos
Facilita el testing y mantenimiento
Implementación con NestJS y TypeORM:
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Cat } from './cat.entity'; @Injectable() export class CatsService { constructor( @InjectRepository(Cat) private catsRepository: Repository<Cat>, ) {} async findAll(): Promise<Cat[]> { return this.catsRepository.find(); } async findOne(id: number): Promise<Cat> { return this.catsRepository.findOne({ where: { id } }); } async create(cat: Cat): Promise<Cat> { return this.catsRepository.save(cat); } async update(id: number, cat: Cat): Promise<void> { await this.catsRepository.update(id, cat); } async remove(id: number): Promise<void> { await this.catsRepository.delete(id); } }
5. TypeORM
TypeORM es un ORM (Object-Relational Mapping) que:
Permite trabajar con bases de datos usando objetos
Soporta múltiples bases de datos (PostgreSQL, MySQL, SQLite, etc.)
Integra perfectamente con NestJS
Configuración básica en NestJS (app.module.ts):
import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: 'localhost', port: 5432, username: 'postgres', password: 'password', database: 'catsdb', entities: [Cat], synchronize: true, // ¡Solo para desarrollo! }), TypeOrmModule.forFeature([Cat]), // Para el repositorio ], // ... }) export class AppModule {}
Relaciones en TypeORM:
// Entidad Owner @Entity() export class Owner { @PrimaryGeneratedColumn() id: number; @Column() name: string; @OneToMany(() => Cat, cat => cat.owner) cats: Cat[]; } // Entidad Cat con relación @Entity() export class Cat { // ... otros campos @ManyToOne(() => Owner, owner => owner.cats) owner: Owner; }
Esta arquitectura (Servicios + Repositorios + Entidades) es fundamental para construir aplicaciones NestJS escalables y mantenibles, separando claramente las responsabilidades entre las diferentes capas de la aplicación.
Comentarios
Publicar un comentario