1
1
import { ApolloServer , type BaseContext } from '@apollo/server' ;
2
2
import { ApolloServerPluginLandingPageGraphQLPlayground } from '@apollo/server-plugin-landing-page-graphql-playground' ;
3
- import { ApolloServerErrorCode } from '@apollo/server/errors' ;
3
+ import {
4
+ ApolloServerErrorCode ,
5
+ unwrapResolverError ,
6
+ } from '@apollo/server/errors' ;
4
7
import { expressMiddleware } from '@apollo/server/express4' ;
5
8
import { ApolloServerPluginLandingPageDisabled } from '@apollo/server/plugin/disabled' ;
6
9
import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer' ;
@@ -191,9 +194,12 @@ export abstract class ApolloBaseDriver<
191
194
if ( options . formatError ) {
192
195
const origFormatError = options . formatError ;
193
196
const transformHttpErrorFn = this . createTransformHttpErrorFn ( ) ;
194
- ( options as ApolloDriverConfig ) . formatError = ( err ) => {
195
- err = transformHttpErrorFn ( err ) as GraphQLError ;
196
- return origFormatError ( err ) ;
197
+ ( options as ApolloDriverConfig ) . formatError = (
198
+ formattedError : GraphQLFormattedError ,
199
+ err : any ,
200
+ ) => {
201
+ err = transformHttpErrorFn ( formattedError , err ) as GraphQLError ;
202
+ return origFormatError ( formattedError , err ) ;
197
203
} ;
198
204
} else {
199
205
( options as ApolloDriverConfig ) . formatError =
@@ -202,33 +208,41 @@ export abstract class ApolloBaseDriver<
202
208
}
203
209
204
210
private createTransformHttpErrorFn ( ) {
205
- return ( originalError : any ) : GraphQLFormattedError => {
206
- const exceptionRef = originalError ?. extensions ?. exception ;
211
+ return (
212
+ formattedError : GraphQLFormattedError ,
213
+ originalError : any ,
214
+ ) : GraphQLFormattedError => {
215
+ const exceptionRef = unwrapResolverError ( originalError ) as any ;
207
216
const isHttpException =
208
217
exceptionRef ?. response ?. statusCode && exceptionRef ?. status ;
218
+
209
219
if ( ! isHttpException ) {
210
- return originalError as GraphQLFormattedError ;
220
+ return formattedError ;
211
221
}
222
+
212
223
let error : GraphQLError ;
213
224
214
225
const httpStatus = exceptionRef ?. status ;
215
226
if ( httpStatus in apolloPredefinedExceptions ) {
216
227
error = new GraphQLError ( exceptionRef ?. message , {
228
+ path : formattedError . path ,
217
229
extensions : {
230
+ ...formattedError . extensions ,
218
231
code : apolloPredefinedExceptions [ httpStatus ] ,
219
232
} ,
220
233
} ) ;
221
234
} else {
222
235
error = new GraphQLError ( exceptionRef . message , {
236
+ path : formattedError . path ,
223
237
extensions : {
238
+ ...formattedError . extensions ,
224
239
code : ApolloServerErrorCode . INTERNAL_SERVER_ERROR ,
225
240
status : httpStatus ,
226
241
} ,
227
242
} ) ;
228
243
}
229
244
230
- error . stack = exceptionRef ?. stacktrace ;
231
- error . extensions [ 'response' ] = exceptionRef ?. response ;
245
+ ( error as any ) . locations = formattedError . locations ;
232
246
return error ;
233
247
} ;
234
248
}
0 commit comments