loopbackio / loopbackio/loopback-next

Regression: secondary HasManyThrough inclusion fails with circular dependency

Ouverte
#7,599 23 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug IoC/Context needs grooming Repository
Langage dominant
TypeScript
Étoiles
5.1k
Forks
1.1k
Merge moyen
2 j 21 h
PR mergées (30 j)
27

Description

After the latest release (and possibly the one before - hard to test), a circular dependency error triggers where none did before.

Steps to reproduce

  1. Create 3 models, e.g. User, Participant, Conversation
  2. Set up bi-directional HasManyThrough relations (User through Participant to Conversation, Conversation through Participant to User)
  3. Use one repository to find instances of the other and include the first, e.g.
    userRepo.conversations(userId).find({include:['users']});
  4. Execute create: userRepo.conversations(userId).create({});
  5. Execute find again: userRepo.conversations(userId).find({include:['users']});

Current Behavior

The first execution of find succeeds. The second fails with (using Todo <-> Assignment <-> Person from linked branch):

Error: Circular dependency detected: repositories.TodoRepository --> @TodoRepository.constructor[2] --> repositories.PersonRepository --> @PersonRepository.constructor[2] --> repositories.TodoRepository
      at ResolutionSession.pushBinding (/home/X/project/loopback-next/packages/context/src/resolution-session.ts:228:13)
      at Function.runWithBinding (/home/X/project/loopback-next/packages/context/src/resolution-session.ts:107:13)
      at Binding.getValue (/home/X/project/loopback-next/packages/context/src/binding.ts:535:40)
      at TodoListApplication.getValueOrPromise (/home/X/project/loopback-next/packages/context/src/context.ts:912:32)
      at TodoListApplication.get (/home/X/project/loopback-next/packages/context/src/context.ts:712:17)
      at getter (/home/X/project/loopback-next/packages/context/src/inject.ts:444:16)
      at fetchHasManyThroughModels (/home/X/project/loopback-next/packages/repository/src/relations/has-many/has-many-through.inclusion-resolver.ts:88:30)
      at processTicksAndRejections (node:internal/process/task_queues:96:5)
      at /home/X/project/loopback-next/packages/repository/src/relations/relation.helpers.ts:112:21
      at async Promise.all (index 0)
      at Object.includeRelatedModels (/home/X/project/loopback-next/packages/repository/src/relations/relation.helpers.ts:120:3)

Expected Behavior

Second execution of find on the HasManyThroughRepositoryFactory should succeed as well.

Link to reproduction sandbox

The Todo example at https://github.com/0x0aNL/loopback-next/tree/hmt-circdep-regression is set up with bi-directional HasManyThrough relations: Todo <-> Assignment <-> Person. A test case in src/__tests__/acceptance/todo.acceptance.ts executes:

await todoRepo.people(1).find({include: ['todos']});
await todoRepo.people(1).create({});
await todoRepo.people(1).find({include: ['todos']});

Additional information

> node -e 'console.log(process.platform, process.arch, process.versions.node)'
linux x64 16.1.0
> npm ls --prod --depth 0 | grep loopback
@loopback/example-todo@3.11.1 /home/X/project/loopback-next/examples/todo
├── @loopback/boot@3.4.1
├── @loopback/core@2.16.1
├── @loopback/repository@3.7.0
├── @loopback/rest-explorer@3.3.1
├── @loopback/rest@9.3.1
├── @loopback/service-proxy@3.2.1
├── loopback-connector-rest@4.0.1

It looks as though this regression is introduced between @loopback/repository@3.5.0 / @loopback/core@2.15.0 and @loopback/repository@3.6.0 / @loopback/core@2.16.0.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par packages/repository/src/relations/has-many/has-many-through.inclusion-resolver.ts et la reproduction de Todo dans src/tests/acceptance/todo.acceptance.ts. Comparez les changements de repository/core entre les versions 3.5.0/2.15.0 et 3.6.0/2.16.0, puis exécutez la séquence en trois étapes find/create/find. C’est terminé lorsque le deuxième find inclus réussit sans erreur de dépendance circulaire.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
nodejs, typescript
Domaine
backend-api-design, databases
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.