-
Notifications
You must be signed in to change notification settings - Fork 228
Description
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:
graphql-client/lib/graphql/client/http.rb
Lines 62 to 63 in aff5882
| # Returns { "data" => ... , "errors" => ... } Hash. | |
| def execute(document:, operation_name: nil, variables: {}, context: {}) |
IMO, the fix is to use Ruby's Exception/Error facility so that library clients can meaningfully handle errors.