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:

Terminal window
1
nest generate service users

Este comando generará un archivo UsersService. Agregamos el siguiente contenido:

1
import { Injectable } from "@nestjs/common";
2
3
@Injectable()
4
export 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:

1
import {
2
Controller,
3
Get,
4
Post,
5
Put,
6
Delete,
7
Param,
8
Body,
9
} from "@nestjs/common";
10
import { UsersService } from "./users.service";
11
12
@Controller("users")
13
export 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:

1
import { Injectable } from "@nestjs/common";
2
import { User } from "./user.entity";
3
4
@Injectable()
5
export 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:

1
import { Injectable } from "@nestjs/common";
2
3
@Injectable()
4
export class AuthService {
5
validateUser(username: string, password: string): boolean {
6
// Supongamos que aquí hay una lista de usuarios
7
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:

1
import { Injectable, HttpService } from "@nestjs/common";
2
import { map } from "rxjs/operators";
3
4
@Injectable()
5
export class ExternalApiService {
6
constructor(private readonly httpService: HttpService) {}
7
8
fetchData() {
9
return this.httpService
10
.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.