Search code examples
javascripttypescriptpromiseapolloapollo-server

How to export a resolved promise and import it again


I would like to export the ApolloServer function to be imported later in a test suite or simply within the index.ts file.

Working code:

  // src/index.ts
;(async () => {
  const app = express()

  await createConnections()

  const apolloServer = new ApolloServer({
    schema: await buildSchema({
      resolvers: [HelloWorldResolver, MovieResolver],
    }),
    context: ({ req, res }) => ({ req, res }),
  })

  apolloServer.applyMiddleware({ app, cors: false })

  app
    .listen({ port: ENVIRONMENT.port, host: ENVIRONMENT.host }, () => {
      console.log(
        `Server ready at http://${ENVIRONMENT.host}:${ENVIRONMENT.port}/graphql`
      )
    })
    .on('error', function (error) {
      console.log(`Failed starting server: ${error}`)
    })
})()

I tried to extract this to a separate file:

// src/apolloServer.ts
export const apolloServer = (async () => {
  return new ApolloServer({
    schema: await buildSchema({
      resolvers: [HelloWorldResolver, MovieResolver],
    }),
    context: ({ req, res }) => ({ req, res }),
  })
})()

And consume it:

// src/index.ts
import { apolloServer } from './apolloServer'
apolloServer.applyMiddleware({ app, cors: false })

The error thrown is:

(node:13848) UnhandledPromiseRejectionWarning: TypeError: apolloServer_1.apolloServer.applyMiddleware is not a function

How is it possible to export and import this function?


Solution

  • build a function to generate brand new ApolloServer instance. run the function anywhere else to generate a brand new ApolloServer

    // src/apolloServer.ts
    export const getApolloServer = async () => {
      return new ApolloServer({
        schema: await buildSchema({
          resolvers: [HelloWorldResolver, MovieResolver],
        }),
        context: ({ req, res }) => ({ req, res }),
      })
    }
    
    // src/index.ts
    import { getApolloServer } from './apolloServer'
    const clonedServer = await getApolloServer();
    clonedServer.applyMiddleware({ app, cors: false })