我想导出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 })
引发的错误是:
(节点:13848)UnhandledPromiseRejectionWarning:TypeError:apolloServer_1.apolloServer.applyMiddleware不是函数
如何导出和导入此功能?
答案 0 :(得分: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 })
答案 1 :(得分: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 })
})();