如何导出已解决的承诺并再次导入
How to export a resolved promise and import it again
我想导出 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
如何导出和导入这个函数?
在您的提取版本中,您没有将 apolloServer
定义为 ApolloServer
的实例,而是作为 运行 和 async
函数的结果。由于 async
总是 return Promise 对象,因此 apolloServer
现在是 Promise 对象。
您应该使用 then
或 await
获取它解析的值。
在您的第一个代码版本中,您肯定 运行 在 async
函数的上下文中,而在第二个版本中, import
部分发生在 [=13= 之外] 功能。你也应该在那里重复 async
模式:
import { apolloServer } from './apolloServer'
(async () => {
(await apolloServer).applyMiddleware({ app, cors: false })
})();
构建一个函数来生成全新的 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 })
我想导出 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
如何导出和导入这个函数?
在您的提取版本中,您没有将 apolloServer
定义为 ApolloServer
的实例,而是作为 运行 和 async
函数的结果。由于 async
总是 return Promise 对象,因此 apolloServer
现在是 Promise 对象。
您应该使用 then
或 await
获取它解析的值。
在您的第一个代码版本中,您肯定 运行 在 async
函数的上下文中,而在第二个版本中, import
部分发生在 [=13= 之外] 功能。你也应该在那里重复 async
模式:
import { apolloServer } from './apolloServer'
(async () => {
(await apolloServer).applyMiddleware({ app, cors: false })
})();
构建一个函数来生成全新的 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 })