diff --git a/packages/apollo-server-core/src/utils/schemaHash.ts b/packages/apollo-server-core/src/utils/schemaHash.ts index e1538fb8067..4ed206951ed 100644 --- a/packages/apollo-server-core/src/utils/schemaHash.ts +++ b/packages/apollo-server-core/src/utils/schemaHash.ts @@ -5,11 +5,23 @@ import stableStringify from 'json-stable-stringify'; import { GraphQLSchema } from 'graphql/type'; import { createHash } from 'crypto'; +const hasOwn = Object.prototype.hasOwnProperty; + export function generateSchemaHash(schema: GraphQLSchema): string { const introspectionQuery = getIntrospectionQuery(); const documentAST = parse(introspectionQuery); const result = execute(schema, documentAST) as ExecutionResult; + // If the execution of an introspection query results in a then-able, it + // indicates that one or more of its resolvers is behaving in an asynchronous + // manner. This is not the expected behavior of a introspection query + // which does not have any asynchronous resolvers. + if (hasOwn.call(result, 'then')) { + throw new Error( + 'The introspection query is resolving asynchronously; execution of an introspection query is not expected to return a `Promise`.', + ); + } + if (!result || !result.data || !result.data.__schema) { throw new Error('Unable to generate server introspection document.'); }