When everything works as expected there are no errors returned from the server, and just the data you requested. Unfortunately, errors do happen. Sometimes because you formatted data request incorrectly and sometimes because something bad happened on the server.
Queries
A query might result in some data and some errors, and those should be returned in a JSON object of the form:
{
"data": { ... },
"errors": [ ... ]
}
If there were no errors returned, the errors field should not be present on the response.
If an error is thrown while resolving a field, the field returns null and an error is be added to the errors list in the response.
An error object includes an extensions object which contains additional information. Its code captures the type of problem, and id is a unique identifier that can be given to Wave Support to assist in an investigation.
See GraphQL Specification 7.1.2 Errors for more information.
Example: Malformed Query
The server fails to validate the query as business does not accept an argument named name.
- Operation
-
query { business(name: "Personal") { id } } - Response
-
{ "errors": [ { "extensions": { "id": "e486c5f4-49b0-456f-897c-6d21bdabcde7", "code": "GRAPHQL_VALIDATION_FAILED" }, "message": "Unknown argument \"name\" on field \"business\" of type \"Query\".", "locations": [ { "line": 2, "column": 12 } ] } ] }
Example: Resource Not Found
The server cannot find a Business with an id of BAD_ID.
- Operation
-
query { business(id: "BAD_ID") { id name } } - Response
-
{ "errors": [ { "extensions": { "id": "d9e441c5-8c54-421b-bcdb-f0c2012a9f9c", "code": "NOT_FOUND" }, "message": "Business 'BAD_ID' could not be found.", "locations": [ { "line": 2, "column": 3 } ], "path": [ "business" ] } ], "data": { "business": null } }
Example: Login Required
Authorization header missing or token is expired.
- Operation
-
query { user { id defaultEmail } } - Response
-
{ "errors": [ { "extensions": { "id": "d9e441c5-8c54-421b-bcdb-f0c2012a9f9c", "code": "UNAUTHENTICATED" }, "message": "Login required.", "locations": [ { "line": 2, "column": 3 } ], "path": [ "user" ] } ], "data": { "user": null } }
Example: Execution Error
These are requests that are properly formatted and are processed by Wave servers, but something bad and unexpected happened. These should be very rare but they do happen and need to be accounted for.
- Operation
-
query { user { id defaultEmail } } - Response
-
{ "errors": [ { "extensions": { "id": "d9e441c5-8c54-421b-bcdb-f0c2012a9f9c", "code": "INTERNAL_SERVER_ERROR" }, "message": "Unknown error.", "locations": [ { "line": 2, "column": 3 } ], "path": [ "user" ] } ], "data": { "user": null } }
Mutations
Mutations can have errors in two different ways:
- Similar to queries, the response can include a list of GraphQL
errors. - Input validation errors returned as
inputErrorsin the mutation'sdataresponse.
Example: Required Field
GraphQL error as requested operation does not match schema requirement, name is expected.
- Operation
-
mutation { customerCreate(input: { businessId: "<BUSINESS_ID>" }) { didSucceed inputErrors { code message path } customer { id name } } } - Response
-
{ "errors": [ { "extensions": { "id": "f99c027d-73ea-4ea7-8583-adfae6a65485", "code": "GRAPHQL_VALIDATION_FAILED" }, "message": "Argument \"input\" has invalid value {businessId: \"<BUSINESS_ID>\"}.", "locations": [ { "line": 2, "column": 25 } ] }, { "extensions": { "id": "d5935ecf-d045-40b0-bc30-62bd2565e671", "code": "GRAPHQL_VALIDATION_FAILED" }, "message": "Field CustomerCreateInput.name of required type String! was not provided.", "locations": [ { "line": 2, "column": 25 } ] } ] }
Example: Missing Value
Input validation error as content meets schema requirements but name requires a value.
- Operation
-
mutation ($name: String!) { customerCreate(input: { businessId: "<BUSINESS_ID>", name: $name }) { didSucceed inputErrors { code message path } customer { id name } } } - Operation Variables
-
{ "name": "" } - Response
-
{ "data": { "customerCreate": { "didSucceed": false, "inputErrors": [ { "code": "REQUIRED", "message": "This field is required.", "path": [ "input", "name" ] } ], "customer": null } } }