Comments (5)
Ok.
It is recommended to not use HTTP status codes 4xx or 5xx in situations where you could use a well-formed graphql response, e.g something like
{
"data": null,
"errors": [ {"message": "User is not authenticated", "code": "..."}]
}
There is no definitive standard for this, as graphql is not bound to a particular transport method (HTTP, websockets... ), but there is this spec: https://github.com/graphql/graphql-over-http , specifically https://github.com/graphql/graphql-over-http/blob/main/spec/GraphQLOverHTTP.md
So for Content-Types of application/json
, which the HttpClient uses, the spec says
The server SHOULD NOT use a 4xx or 5xx status code.
This is why HttpLinks throws an Exception instead of returning a Response()
object with the parsed errors, which is why your graphqlErrors list is null and the error details are only in your LinkException
.
HttpLink should probably make this configurable though.
What you can do here instead:
- put an ErrorLink() before your HttpLink() so you can turn these Exceptions into Responses with proper graphlErrors
- just cast your exceptions to HttpLinkServerException, but then you are relying on the current implementation of your terminal link
- open a PR in the gql-dart repo to add configuration in the HttpLink on which status code are expected (which should return a normal Response if well-formed) and which are unexpected errors which should always be treated a exception
from ferry.
You shouldn't really be throwing errors for graphQL servers if you can help it IMO.
Errors are schemaless and hard to keep track of.
Consider using Unions instead, that way it makes it easier for an application to respond to what has happened.
Your application is then not hijacked by REST status codes and you can make objects of types that make sense for your application
interface BaseError {
message: String!
}
type UnknownError implements BaseError {
message: String!
}
type NotAllowedError implements BaseError {
message: String!
}
type UsersPage {
count: Int!
edges: [UserEdge!]!
pageInfo: PageInfo!
}
union UsersPageResult =
UsersPage
| NotAuthed
| NotAllowedError
| UnknownError
type Query {
users(input: UserCursorPaginationInput!): UsersPageResult!
}
from ferry.
Hm... seems like this solved it;
print("${(res.linkException as HttpLinkServerException).parsedResponse}");
Is there any documentation around this or a better way we can expose the error?
from ferry.
Does the server send an HTTP status code > 300 for this error?
the httpLink only parses requests with HTTP status code >= 200 <300, otherwise it throws an exception.
See https://github.com/gql-dart/gql/blob/master/links/gql_http_link/lib/src/link.dart#L80
from ferry.
Yup. It throws a 401. That's what made me think I needed to cast the res.linkException
with HttpLinkServerException
.
throw new GraphQLError('User is not authenticated', {
extensions: {
code: 'Unauthenticated',
http: { status: 401 },
},
});
from ferry.
Related Issues (20)
- Custom ISO serializer for DateTime HOT 5
- How to remove the `__typename` in the `toJson` of a fragment HOT 2
- Change in cache doesn't propagate HOT 28
- [Feature Request] Add `ContextEntries` to requests that can be retrieved in custom `gql` `Link` HOT 9
- [Feature Request] Access properties using Maps (ferry_generator) HOT 3
- [question]: Freezed support HOT 4
- [Feature Request] a CLI that output unused field/argument in the schema HOT 1
- Generating tristate_optionals generates invalid code with mixed up imports HOT 10
- Unable to Upload Multipart File with dio link HOT 2
- ferry_flutter: endless loading state after the cache has been cleared HOT 1
- Null check operator used on a null value and "Bad Element" HOT 1
- schema.schema.gql.dart not generated - "possibleTypesMap" missing HOT 3
- Ferry cannot decompose fragment on TypeCondition HOT 1
- Manually update the ferry data HOT 1
- TypePolicy is broken Or there is no clear documentation about it. HOT 12
- The relevant error-causing widget was:
- [Feature Request] Export request query to graphql HOT 1
- Non-dev dependency in ferry_generator package HOT 2
- Simple example calling a mutation on click and handling the response HOT 7
- How to create a request of Extends Query Type HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from ferry.