@@ -115,6 +115,15 @@ export interface OptionsData {
115
115
*/
116
116
formatError ?: ( error : GraphQLError ) => GraphQLFormattedError ;
117
117
118
+ /**
119
+ * Use this to modify the response when a runtime query error occurs. By
120
+ * default the statusCode will be set to 500.
121
+ */
122
+ handleRuntimeQueryErrorFn ?: (
123
+ result : ExecutionResult ,
124
+ response : Response ,
125
+ ) => void ;
126
+
118
127
/**
119
128
* An optional function for adding additional metadata to the GraphQL response
120
129
* as a key-value object. The result will be added to "extensions" field in
@@ -200,6 +209,7 @@ export function graphqlHTTP(options: Options): Middleware {
200
209
let formatErrorFn = formatError ;
201
210
let pretty = false ;
202
211
let result : ExecutionResult ;
212
+ let optionsData : OptionsData | undefined ;
203
213
204
214
try {
205
215
// Parse the Request to get GraphQL request parameters.
@@ -208,7 +218,7 @@ export function graphqlHTTP(options: Options): Middleware {
208
218
} catch ( error : unknown ) {
209
219
// When we failed to parse the GraphQL parameters, we still need to get
210
220
// the options object, so make an options call to resolve just that.
211
- const optionsData = await resolveOptions ( ) ;
221
+ optionsData = await resolveOptions ( ) ;
212
222
pretty = optionsData . pretty ?? false ;
213
223
formatErrorFn =
214
224
optionsData . customFormatErrorFn ??
@@ -218,7 +228,7 @@ export function graphqlHTTP(options: Options): Middleware {
218
228
}
219
229
220
230
// Then, resolve the Options to get OptionsData.
221
- const optionsData : OptionsData = await resolveOptions ( params ) ;
231
+ optionsData = await resolveOptions ( params ) ;
222
232
223
233
// Collect information from the options data object.
224
234
const schema = optionsData . schema ;
@@ -388,13 +398,22 @@ export function graphqlHTTP(options: Options): Middleware {
388
398
}
389
399
}
390
400
391
- // If no data was included in the result, that indicates a runtime query
392
- // error, indicate as such with a generic status code.
393
- // Note: Information about the error itself will still be contained in
394
- // the resulting JSON payload.
395
- // https://graphql.github.io/graphql-spec/#sec-Data
396
- if ( response . statusCode === 200 && result . data == null ) {
397
- response . statusCode = 500 ;
401
+ if ( result . errors != null || result . data == null ) {
402
+ const handleRuntimeQueryErrorFn =
403
+ optionsData ?. handleRuntimeQueryErrorFn ??
404
+ ( ( _result , _response ) => {
405
+ // If no data was included in the result, that indicates a runtime query
406
+ // error, indicate as such with a generic status code.
407
+ // Note: Information about the error itself will still be contained in
408
+ // the resulting JSON payload.
409
+ // https://graphql.github.io/graphql-spec/#sec-Data
410
+
411
+ if ( _response . statusCode === 200 && _result . data == null ) {
412
+ _response . statusCode = 500 ;
413
+ }
414
+ } ) ;
415
+
416
+ handleRuntimeQueryErrorFn ( result , response ) ;
398
417
}
399
418
400
419
// Format any encountered errors.
0 commit comments