如何导出已解决的承诺并再次导入

问题描述 投票:0回答:2

我想导出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不是一个函数

如何导出和导入此功能?

javascript typescript promise apollo apollo-server
2个回答
1
投票

构建函数以生成全新的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 })

1
投票

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

您应该使用thenawait获取其解析为的值。

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

import { apolloServer } from './apolloServer'
(async () => {
    (await apolloServer).applyMiddleware({ app, cors: false })
})();
© www.soinside.com 2019 - 2024. All rights reserved.