@@ -115,6 +115,15 @@ export interface OptionsData {
115115 */
116116 formatError ?: ( error : GraphQLError ) => GraphQLFormattedError ;
117117
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+
118127 /**
119128 * An optional function for adding additional metadata to the GraphQL response
120129 * as a key-value object. The result will be added to "extensions" field in
@@ -200,6 +209,7 @@ export function graphqlHTTP(options: Options): Middleware {
200209 let formatErrorFn = formatError ;
201210 let pretty = false ;
202211 let result : ExecutionResult ;
212+ let optionsData : OptionsData | undefined ;
203213
204214 try {
205215 // Parse the Request to get GraphQL request parameters.
@@ -208,7 +218,7 @@ export function graphqlHTTP(options: Options): Middleware {
208218 } catch ( error : unknown ) {
209219 // When we failed to parse the GraphQL parameters, we still need to get
210220 // the options object, so make an options call to resolve just that.
211- const optionsData = await resolveOptions ( ) ;
221+ optionsData = await resolveOptions ( ) ;
212222 pretty = optionsData . pretty ?? false ;
213223 formatErrorFn =
214224 optionsData . customFormatErrorFn ??
@@ -218,7 +228,7 @@ export function graphqlHTTP(options: Options): Middleware {
218228 }
219229
220230 // Then, resolve the Options to get OptionsData.
221- const optionsData : OptionsData = await resolveOptions ( params ) ;
231+ optionsData = await resolveOptions ( params ) ;
222232
223233 // Collect information from the options data object.
224234 const schema = optionsData . schema ;
@@ -388,13 +398,22 @@ export function graphqlHTTP(options: Options): Middleware {
388398 }
389399 }
390400
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 ) ;
398417 }
399418
400419 // Format any encountered errors.
0 commit comments