Soluciones a referencias circulares en módulos NestJS
Clase 35 de 36 • Curso de NestJS: Persistencia de Datos con TypeORM
Contenido del curso
Database
- 3

Instalación de Docker en Windows, macOS y Ubuntu
01:35 min - 4

Configuración de Postgres en Docker Compose
09:18 min - 5

Conexión a Postgres en Docker: Terminal y PgAdmin
15:16 min - 6

Conexión de NestJS a Postgres con Node Postgres
07:28 min - 7

Inyección de Dependencias en NETJS: Conexión a PostgreSQL
10:49 min - 8

Conexión a Bases de Datos con Variables de Entorno en Node.js
13:49 min
TypeORM
- 9

Implementación de TypeORM con NestJS en Proyectos Node.js
09:14 min - 10

Creación de Entidades en ORM para Tiendas Virtuales
07:46 min - 11

Implementación del Patrón Repository en NestJS con TypeORM
13:31 min - 12

Operaciones CRUD en ProductService usando TypeORM y Postgres
13:35 min - 13

Cambio de Postgres a MySQL en Docker para CRUD de Productos
17:28 min
Migraciones
Relaciones
- 18

Relaciones 1 a 1 en Bases de Datos con TimeORM
18:58 min - 19

Manipulación de Relaciones Uno a Uno en Controladores y Servicios
10:28 min - 20

Relaciones Uno a Muchos en Bases de Datos con TypeORM
10:36 min - 21

Gestión de Relaciones Uno a Muchos en Controladores de API
10:27 min - 22

Relaciones Muchos a Muchos en Time1M: Creación y Manejo Práctico
08:38 min - 23

Manipulación de Relaciones Muchos a Muchos en Controladores
15:08 min - 24

Manipulación de Relaciones Muchos a Muchos con TimeORM en JavaScript
19:08 min - 25

Relaciones Muchos a Muchos con Campos Agregados en TimeWareM
16:40 min - 26

CRUD de órdenes de compra y gestión de ítems en NestJS
30:07 min
Consultas
- 27

Paginación de Productos con Limit y Offset en Controladores API
10:37 min - 28

Filtrado de Precios con Rango Usando Between en Time Wareham
10:16 min - 29

Indexación de Parámetros en Bases de Datos: Uso y Precauciones
02:54 min - 30

Buenas prácticas de nombramiento en JavaScript y bases de datos
17:52 min - 31

Serialización y Transformación de Datos en APIs con ClassTransformer
16:55 min
Migración a NestJS 9 y TypeORM 0.3
Próximos pasos
NestJS Realmente es un framework potente que nos permite tener una arquitectura sólida y escalable. Pero al conectarnos con bases de datos podemos llegar a enfrentarnos a una referencia circular, problema que debemos evitar y/o aprender a solucionar.
En nuestro proyecto tenemos a UsersModule que importa a ProductsModule con el fin usar al ProductsService. Pero ¿qué pasa si _ProductsModule_ necesita hacer una consulta hacia users? Recuerda que dentro de UsersModule está el UserService y la entidad de Users. Si importamos a UserModule dentro de ProductsModule, tendríamos un problema de referencia circular entre módulos.
Existen dos maneras de solucionarlo si llegas a tener este caso.
Solución 1: entidades en un Global Module
Una de las soluciones es poner todas las entidades de tu proyecto en el DatabaseModule de manera global haciendo que cada uno de los demás módulos pueda usar estas entidades sin tener problemas de referencia circular.
De esta manera cada módulo puede usar el Repository Pattern y hacer la consulta que necesite de una entidad, puedes ver un ejemplo de esta solución en la rama 21 y detalle de cambios 😎
Solución 2: Referencia directa
Una de las formas que tiene NestJS para resolver la referencia circular es tener una referencia directa por ejemplo, si AService y BService dependen el uno del otro, ambos lados de la relación pueden usar @Inject () y la utilidad forwardRef () para resolver la dependencia circular, ejemplo:
@Injectable() export class AService { constructor( @Inject(forwardRef(() => BService )) private service: BService , ) {} }
De la misma manera en el otro servicio.
@Injectable() export class BService { constructor( @Inject(forwardRef(() => AService )) private service: AService , ) {} }
También puedes aplicar lo mismo entre módulos
@Module({ imports: [forwardRef(() => AModule)], }) export class BModule{}
@Module({ imports: [forwardRef(() => BModule)], }) export class AModule{}
¿Te has enfrentado a un problema de referencia circular? Compártenos en los comentarios de qué manera lo resolviste.