@service(GeocoderProvider) Fails with "No Binding Found" in LoopBack Component
I maintainer di solito rispondono entro 2 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Ferma
- Stack tecnologico
- typescript
- Ambito
- backend
Direzione di ricerca
Inizia nell’application.ts dell’esempio todo e segui la registrazione di Service Booter fino a @service e filterByServiceInterface. Leggi il percorso createServiceBinding e il comportamento proposto dei metadati @serviceOptions, quindi riproduci il fallimento con il ramo bug-no-binding-found e GET /todo. Il lavoro è completato quando il GeocoderProvider sovrascritto viene risolto tramite @service senza un errore No binding found.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
Problem Description
@service(GeocoderProvider) Fails with "No Binding Found" in LoopBack Component after overriding the same class via Service booter in application.
❓ Problem Statement
You created a custom LoopBack Component named DummyComponent, which declares and registers models, repositories, controllers, and a service (GeocoderProvider):
export class DummyComponent implements Component {
...
services?: ServiceOrProviderClass[];
...
constructor(
@inject(CoreBindings.APPLICATION_INSTANCE)
private application: Application,
) {
this.services = [GeocoderProvider]; // <-- Intended to register the service
}
}
and used in a controller as
export class TodoController {
constructor(
@repository(TodoRepository)
public todoRepository: TodoRepository,
@service(GeocoderProvider) // <-- This fails
protected geoService: Geocoder,
) {}
}
i added DummyComponent in application.ts as
this.component(DummyComponent);
this works fine. but when i override the GeocoderProvider via Service Booter.
this gives me error
500 Error: No binding found for GeocoderProvider.
Make sure a service binding is created in context RequestContext-xxxx with serviceInterface (GeocoderProvider).
Steps to reproduce:
- clone repo https://github.com/Tyagi-Sunny/loopback-next/tree/master
- do npm i
- move to branch bug-no-binding-found
- move to todo example in examples dir - cd examples/todo/
- run npm start
- go to http://localhost:3000
- hit GET /todo
Reason for this error->
@service decorator filters the binding based on a functions
export function filterByServiceInterface(
serviceInterface: ServiceInterface,
): BindingFilter {
return binding =>
binding.valueConstructor === serviceInterface ||
binding.tagMap[CoreTags.SERVICE_INTERFACE] === serviceInterface;
}
and if we explicitly does not provide interface then it uses class itself as interface and used it for comparison. and we end up with two different services that causes comparison to fail and returning no binding found.
As we don't have any options to provide this interface(serviceOptions) via service booter. either we need to Manually bind services after the boot process (defeating the purpose of convention-based discovery)
Solution:
I have created a decorator @serviceOptions decorator that allows you to annotate service classes with configuration options metadata. It uses the factory pattern to create decorators with a specific options metadata key.
Then createServiceBinding function is the core registration mechanism that:
- Extracts metadata: Retrieves decorator-defined options from the class
- Merges configurations: Combines decorator metadata with manually passed options (manual options take precedence)
- and rest will be same
Logs
Additional information
No response
Reproduction
https://github.com/Tyagi-Sunny/loopback-next/tree/bug-no-binding-found
- Lingua principale
- TypeScript
- Stelle
- 5.1k
- Fork
- 1.1k
- Merge medio
- 3g 15h
- PR unite (30g)
- 23
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di loopbackio/loopback-next
-
Docs good first issue help wanted
Difficoltà 1/5 1-3 ore Idoneità per principianti 68/100
loopbackio/loopback-next#683 · 3 commenti ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 55/100
loopbackio/loopback-next#11726 ·
I maintainer di solito rispondono entro 2 giorni
-
bug
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
loopbackio/loopback-next#11500 · 1 commento · 1 reazione ·
I maintainer di solito rispondono entro 2 giorni
-
bug
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
loopbackio/loopback-next#11412 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
bug help wanted
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
loopbackio/loopback-next#11396 · 2 commenti · 1 reazione ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di loopbackio/loopback-next
Issue simili
-
triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
github/docs#46222 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
agent-ready area: config area: skills type: chore upstream: brain-kit
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 95/100
-
enhancement priority:low ready-for-dev
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
I maintainer di solito rispondono entro 1 giorno
-
bug escritorio mapa
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
marcosferr/reporte-ciudadano#4 · 1 commento ·
-
area: material/sort gemini-triaged needs triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
angular/components#33933 ·
I maintainer di solito rispondono entro 1 giorno