- 1

Instalación y configuración inicial de NestJS para APIs
06:28 - 2

Instalación del CLI de NestJS y primer proyecto con API
11:29 - 3

Creación de endpoints dinámicos para consultar usuarios en NestJS
20:23 - 4

Operaciones CRUD en APIs REST con Postman
23:37 - 5

Método PUT para actualizar usuarios con ID automático
19:42 - 6

Códigos de estado HTTP y manejo de errores en APIs con NestJS
16:07 - 7

DTOs y validación automática de datos en APIs con NestJS
19:31 - 8

Patrón de servicios e inyección de dependencias en NestJS
25:09 - 9

Configuración de variables de entorno en NestJS
20:44 - 10

Creación y organización de módulos en NestJS para aplicaciones escalables
12:26 quiz de Fundamentos y Primer CRUD
Patrón de servicios e inyección de dependencias en NestJS
Clase 8 de 35 • Curso de Backend con NestJS
Contenido del curso
- 11

Configuración de PostgreSQL con Docker y Docker Compose
16:08 - 12

Configuración de PostgreSQL con TypeORM en aplicaciones NestJS
12:17 - 13

Creación de entidades ORM con decoradores en TypeScript
09:17 - 14

Implementación del Repository Pattern con TypeORM en NestJS
29:55 - 15

Relaciones uno a uno entre usuarios y perfiles en PostgreSQL
17:00 - 16

Actualización de DTOs con mapped types en NestJS para perfil y usuario
38:56 - 17

Generación automática de módulos CRUD con NestJS y AI
25:34 - 18

Relaciones uno a muchos con TypeORM en NestJS
17:56 - 19

Creación de entidad Category con relaciones many-to-many en NestJS
15:28 - 20

Relaciones many-to-many con TypeORM y validación de arrays
17:40 - 21

Reutilización de servicios entre módulos en NestJS
09:04 - 22

Configuración de migraciones de base de datos con TypeORM
23:01 - 23

Migraciones de base de datos sin pérdida de información
20:46 quiz de Base de Datos y Persistencia con TypeORM
- 24

Cómo proteger contraseñas con hashing usando Bcrypt en NestJS
10:15 - 25

Serialización de datos para excluir campos sensibles en APIs
04:13 - 26

Configuración de autenticación con Passport en NestJS
19:16 - 27

Implementación de endpoint de login con Node.js y NestJS
09:09 - 28

Implementación de JSON Web Token para autenticación en NestJS
16:15 - 29

Protección de endpoints con JWT guards en NestJS
11:34 - 30

Automatización de user ID en APIs con JWT
11:48 quiz de Autenticación y Autorización
- 31

Integración del SDK de OpenAI en Node.js para automatizar contenido
28:26 - 32

Documentación automática de APIs con Swagger en NestJS
15:59 - 33

Preparar una API Node.js para producción: seguridad y despliegue
10:46 - 34

Desplegar aplicación Node.js a producción con Railway y PostgreSQL
21:11 - 35

Desarrollo de API REST escalable con NestJS en producción
02:36
Gestionar correctamente la separación de responsabilidades en una aplicación es esencial para crear proyectos sólidos, escalables y bien organizados. NestJS adopta patrones de diseño que favorecen el desarrollo profesional, como la división clara entre controllers y servicios. Aquí desglosamos cómo funcionan estos componentes y cómo refactorizar tu código para mejorar la arquitectura de tus apps.
¿Qué diferencia hay entre un controller y un servicio en NestJS?
Los controllers tienen la responsabilidad de exponer los endpoints, manejar los protocolos como GET, POST, DELETE y recibir los parámetros necesarios. Además, trabajan con la validación de datos usando DTOs (Data Transfer Objects) para asegurar que la información entrante cumpla ciertos criterios.
Por su parte, los servicios se ocupan exclusivamente de la gestión de datos y de procesar la lógica de negocio. Son el centro donde se implementa la regla de una sola responsabilidad, clave para mantener un código claro. Además, al aplicar el patrón singleton y la inyección de dependencias, un servicio puede ser reutilizado en diferentes controllers sin crear instancias duplicadas. Esto optimiza el uso de recursos y mantiene la integridad de los datos.
¿Cómo se implementa la separación de responsabilidades en la arquitectura?
Dividir los roles de controllers y servicios permite que cada uno se concentre en lo que mejor sabe hacer:
- Controllers: Exponen métodos, endpoints y validan datos a través de DTOs.
- Servicios: Ejecutan la lógica de manipulación de datos: crear, actualizar, eliminar y buscar información.
Un ejemplo práctico es trasladar la automatización del ID, la lógica de actualización y borrado, o la validación de existencia desde el controller al servicio. De este modo, el controller queda más "limpio" y enfocado solo en gestionar la interacción con el cliente.
¿Cómo se utiliza la inyección de dependencias y el patrón singleton?
Mediante el decorador @Injectable, NestJS permite que los servicios sean inyectados en los controllers de forma sencilla y eficiente. Esto asegura que, sin importar cuántos controllers utilicen el mismo servicio, solo exista una instancia activa (singleton pattern), evitando inconsistencias y duplicación de datos en memoria.
Al inyectar el servicio en el constructor del controller, este accede a los métodos públicos del servicio para tareas como encontrar, crear o eliminar usuarios. Así, el controller solo solicita la acción y el servicio ejecuta la lógica definida.
¿Cuáles son los beneficios de reutilizar y refactorizar métodos en los servicios?
Centralizar la lógica de negocio en los servicios reduce la repetición de código y facilita el mantenimiento. Por ejemplo:
- Métodos reutilizables como
findOne,getUserById, odeletepueden emplearse en varios lugares sin duplicar lógica. - Los métodos privados ayudan a gestionar operaciones internas y mantener la interfaz pública del servicio clara y simple.
- Cuando se necesita adaptar la lógica (como devolver la posición de un usuario en un array), basta con ajustar el servicio en un solo lugar.
Esto da como resultado una API más robusta, donde los endpoints son consistentes y las reglas de negocio se aplican de forma uniforme.
¿Qué retos puedes abordar para seguir profundizando en servicios y controllers?
Una buena forma de afianzar lo aprendido es intentar reutilizar un servicio en diferentes controllers. Por ejemplo, puedes inyectar el usersService también en el appController y comprobar cómo se mantiene una única instancia del servicio a través de toda la aplicación.
¿Ya has probado este tipo de refactorización? Comparte cómo lo implementaste y qué desafíos encontraste en el camino.