nestjs / graphql

GraphQL (TypeScript) module for Nest framework (node.js) 🍷
https://docs.nestjs.com/graphql/quick-start
MIT License
1.46k stars 397 forks source link

GraphQL error not formatted properly when it returns a 4xx or 5xx http status #2940

Open remonke opened 1 year ago

remonke commented 1 year ago

Is there an existing issue for this?

Current behavior

In Apollo, there's a way of providing a custom http status via extensions on the GraphQLError / ApolloError, as is the case with the default validation error, which returns a status of 400. Unfortunately, instead of the response being formatted the usual way - with data and errors, everything gets wrapped inside of the error object. Is there any way to disable this behavior?

Screenshot_20230727_050425 Screenshot_20230727_050459

Minimum reproduction code

https://github.com/remonke/nest-graphql-error-bug

Steps to reproduce

Install the dependencies pnpm install Start the server Open the playground Test the two available queries throwError and throwErrorWithHttpStatus

Expected behavior

I expect a GraphQL errror with a custom http status to get formatted like all the others.

Package version

12.0.8

Graphql version

graphql: 16.7.1 @apollo/server: 4.8.1 @nestjs/apollo: ^12.0.7

NestJS version

10.0.0

Node.js version

20.4.0

In which operating systems have you tested?

Other

No response

kamilmysliwiec commented 1 year ago

Would you like to create a PR for this issue?

remonke commented 1 year ago

I would try, except I have no idea what causes this behavior - I tried this with Mercurius driver and it works just fine

jan-hecker commented 1 year ago

You can probably disable this behavior if you create a custom error formatter. You can provide the error formatter in the GraphQL options with the formatError argument

tanmen commented 3 months ago

You can probably disable this behavior if you create a custom error formatter. You can provide the error formatter in the GraphQL options with the formatError argument

I have tried this and it did not resolve the problem.