Explicación Detallada de los Servicios en NestJS: Creación e Inyección de Servicios y Gestión de la Lógica de Negocios
- 741Palabras
- 4Minutos
- 08 Jul, 2024
Los servicios son uno de los conceptos centrales en NestJS, utilizados para gestionar la lógica de negocios de la aplicación. Este artículo explicará en detalle el concepto de servicios en NestJS, cómo crear e inyectar servicios y cómo gestionar la lógica de negocios a través de servicios.
Descripción General de los Servicios
Los servicios son clases utilizadas para encapsular y gestionar la lógica de negocios. En NestJS, los servicios generalmente se utilizan a través del mecanismo de inyección de dependencias (Dependency Injection). Los servicios pueden ser inyectados en controladores, otros servicios o módulos para proporcionar reutilización y separación de la lógica de negocios.
Creación de Servicios
En NestJS, crear servicios es muy sencillo. Podemos utilizar el CLI de NestJS para generar servicios o crearlos manualmente. Aquí hay un ejemplo de cómo crear un servicio usando el CLI de NestJS:
1nest generate service users
Este comando generará un archivo UsersService
. Agregamos el siguiente contenido:
1import { Injectable } from "@nestjs/common";2
3@Injectable()4export class UsersService {5 private readonly users = [];6
7 findAll() {8 return this.users;9 }10
11 findOne(id: string) {12 return this.users.find((user) => user.id === id);13 }14
15 create(user) {16 this.users.push(user);17 }18
19 update(id: string, user) {20 const existingUser = this.findOne(id);21 if (existingUser) {22 Object.assign(existingUser, user);23 }24 }25
26 remove(id: string) {27 const index = this.users.findIndex((user) => user.id === id);28 if (index !== -1) {29 this.users.splice(index, 1);30 }31 }32}
En el ejemplo anterior, UsersService
es una clase con el decorador @Injectable()
. Este decorador le indica a NestJS que esta clase es un servicio inyectable.
Inyección de Servicios
En NestJS, los servicios pueden ser inyectados en controladores u otros servicios. Aquí hay un ejemplo de cómo inyectar UsersService
en UsersController
:
1import {2 Controller,3 Get,4 Post,5 Put,6 Delete,7 Param,8 Body,9} from "@nestjs/common";10import { UsersService } from "./users.service";11
12@Controller("users")13export class UsersController {14 constructor(private readonly usersService: UsersService) {}15
16 @Get()17 findAll() {18 return this.usersService.findAll();19 }20
21 @Get(":id")22 findOne(@Param("id") id: string) {23 return this.usersService.findOne(id);24 }25
26 @Post()27 create(@Body() createUserDto: CreateUserDto) {28 return this.usersService.create(createUserDto);29 }30
31 @Put(":id")32 update(@Param("id") id: string, @Body() updateUserDto: UpdateUserDto) {33 return this.usersService.update(id, updateUserDto);34 }35
36 @Delete(":id")37 remove(@Param("id") id: string) {38 return this.usersService.remove(id);39 }40}
En el ejemplo anterior, inyectamos UsersService
en el constructor de UsersController
. De esta manera, podemos utilizar la lógica de negocios proporcionada por el servicio en los métodos del controlador.
Gestión de la Lógica de Negocios
Los servicios se utilizan para encapsular y gestionar la lógica de negocios, separándola de los controladores, lo que hace que el código sea más modular y mantenible. Aquí hay algunos ejemplos comunes de gestión de lógica de negocios:
Gestión de Almacenamiento de Datos
Los servicios pueden ser utilizados para gestionar operaciones de almacenamiento y recuperación de datos, como consultar datos de una base de datos o guardar datos. Aquí hay un ejemplo de gestión de almacenamiento de datos de usuarios:
1import { Injectable } from "@nestjs/common";2import { User } from "./user.entity";3
4@Injectable()5export class UsersService {6 private readonly users: User[] = [];7
8 findAll(): User[] {9 return this.users;10 }11
12 findOne(id: string): User {13 return this.users.find((user) => user.id === id);14 }15
16 create(user: User) {17 this.users.push(user);18 }19
20 update(id: string, user: User) {21 const existingUser = this.findOne(id);22 if (existingUser) {23 Object.assign(existingUser, user);24 }25 }26
27 remove(id: string) {28 const index = this.users.findIndex((user) => user.id === id);29 if (index !== -1) {30 this.users.splice(index, 1);31 }32 }33}
Gestión de Reglas de Negocios
Los servicios pueden ser utilizados para gestionar reglas y lógica de negocios complejas, como calcular descuentos, validar la entrada de usuarios, etc. Aquí hay un ejemplo de gestión de validación de usuarios:
1import { Injectable } from "@nestjs/common";2
3@Injectable()4export class AuthService {5 validateUser(username: string, password: string): boolean {6 // Supongamos que aquí hay una lista de usuarios7 const users = [{ username: "test", password: "password" }];8
9 const user = users.find(10 (user) => user.username === username && user.password === password,11 );12 return !!user;13 }14}
Llamadas a API Externas
Los servicios también pueden ser utilizados para realizar llamadas a API externas, como obtener datos a través de solicitudes HTTP o interactuar con servicios de terceros. Aquí hay un ejemplo de una llamada a una API externa:
1import { Injectable, HttpService } from "@nestjs/common";2import { map } from "rxjs/operators";3
4@Injectable()5export class ExternalApiService {6 constructor(private readonly httpService: HttpService) {}7
8 fetchData() {9 return this.httpService10 .get("https://api.example.com/data")11 .pipe(map((response) => response.data));12 }13}
Conclusión
Este artículo explicó en detalle el concepto de servicios en NestJS, cómo crear e inyectar servicios y cómo gestionar la lógica de negocios a través de servicios. Los servicios juegan un papel crucial en NestJS, ya que encapsulan la lógica de negocios, haciendo que el código sea más modular y mantenible.