loopbackio / loopbackio/loopback-next
Regression: secondary HasManyThrough inclusion fails with circular dependency
Personne n'a encore pris cette issue.
- 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
- Create 3 models, e.g. User, Participant, Conversation
- Set up bi-directional HasManyThrough relations (User through Participant to Conversation, Conversation through Participant to User)
- Use one repository to find instances of the other and include the first, e.g.
userRepo.conversations(userId).find({include:['users']}); - Execute
create:userRepo.conversations(userId).create({}); - Execute
findagain: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
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- 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