github-community-projects / github-community-projects/graphql-client
[Bug] Network errors are discarded.
- Lingua principale
- Ruby
- Stelle
- 78
- Fork
- 228
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
If there's an HTTP error, calls to `GraphQL::Client` can return this:
```
KeyError: key not found: "data" (KeyError)
```
E.g., when I try the example in the readme to `https://example.com/graphql`, I expect some kind of network or HTTP error. Instead, I get the above `KeyError`.
I got this when making changes to my infrastructure. It made it very hard to debug problems.
----
I looked at `load_schema`, and found:
```
pry(main)> GraphQL::Client.load_schema(HTTP)
KeyError: key not found: "data" (KeyError)
from gems/3.4.0/gems/graphql-2.5.2/lib/graphql/schema/loader.rb:17:in 'Hash#fetch'
```
The `load_schema` call turns into `load_schema(dump_schema(HTTP))`. `dump_schema` seems to return full error info. So, between those two function calls, the information is lost:
```
[pry(main)> GraphQL::Client.dump_schema(HTTP)
=> {"errors" => [{"message" => "403 Forbidden"}]}
```
This happens other places that call `execute`, I believe, like `.query()`.
----
In my opinion, the core problem is, the library uses fp-style `Either` error returns. However, Ruby doesn't have a way (like Rust or Haskell do) to enforce the handling of the error case. And so, it's possible to simply not handle them appropriately, like here.
Either-style API:
https://github.com/github-community-projects/graphql-client/blob/aff58829ea27c7e59213756aab0bdfdb0e03941a/lib/graphql/client/http.rb#L62-L63
IMO, the fix is to use Ruby's Exception/Error facility so that library clients can meaningfully handle errors.
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
Inizia con lib/graphql/client/http.rb intorno al valore restituito in stile Either e con lib/graphql/schema/loader.rb, dove load_schema consuma dump_schema. Segui il percorso dell’errore attraverso load_schema e gli altri chiamanti di execute menzionati, incluso query(), quindi verifica che gli errori HTTP o GraphQL rimangano disponibili invece di diventare un KeyError.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- ruby
- Ambito
- api
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100