1

我想导出ApolloServer要稍后在测试套件中导入的函数,或者只是在index.ts文件中导入。

工作代码:

  // 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}`)
    })
})()

我试图将其提取到一个单独的文件中:

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

并消费它:

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

抛出的错误是:

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

如何导出和导入此功能?

4

2 回答 2

2

构建一个函数来生成全新的 ApolloServer 实例。在其他任何地方运行该函数以生成一个全新的 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 })
于 2020-06-08T09:34:08.067 回答
1

在您提取的版本中,您没有定义apolloServer为 的实例 ApolloServer,而是定义为运行async函数的结果。由于async函数总是返回一个 Promise 对象,apolloServer现在是一个 Promise 对象。

then您应该使用或获得它解析的值await

在您的第一个代码版本中,您肯定是在async函数的上下文中运行的,而在第二个版本中,该import部分发生在async函数之外。您也应该在async那里重复该模式:

import { apolloServer } from './apolloServer'
(async () => {
    (await apolloServer).applyMiddleware({ app, cors: false })
})();
于 2020-06-08T09:29:31.353 回答