升级apollo-server到v3后调用applyMiddleware报错如何解决
Apollo Server 3.x 启动报错解决方案
报错核心原因
Apollo Server 3.x 版本移除了隐式启动逻辑,必须异步等待server.start()执行完成后,才能调用server.applyMiddleware()挂载中间件,仅调用server.start()不加await会导致启动逻辑未完成就执行挂载,仍然触发报错。
可行解决步骤
第一步:调整代码结构,正确添加await逻辑
多数场景下报错是因为未异步等待启动完成,将启动逻辑包裹在自执行异步函数中即可,示例代码如下:import { ApolloServer } from 'apollo-server-express'; import express from 'express'; import { typeDefs, resolvers } from './schema'; const app = express(); const server = new ApolloServer({ typeDefs, resolvers }); // 用自执行异步函数包裹启动逻辑,保证await生效 (async () => { await server.start(); server.applyMiddleware({ app }); app.listen({ port: 4000 }, () => console.log(`服务已启动,访问地址:http://localhost:4000${server.graphqlPath}`) ); })();如果你的项目使用ES模块(package.json中配置了
"type": "module"),且Node.js版本>=14.8,也可以直接使用顶层await:const app = express(); const server = new ApolloServer({ typeDefs, resolvers }); await server.start(); server.applyMiddleware({ app }); app.listen({ port: 4000 }, () => console.log(`服务已启动,访问地址:http://localhost:4000${server.graphqlPath}`) );第二步:排查代码执行顺序
检查是否存在其他逻辑提前触发了applyMiddleware调用,或者server.start()被放置在未生效的条件分支中,没有实际执行。第三步:检查依赖版本一致性
如果调整代码后仍然报错,执行npm ls apollo-server-core检查apollo-server-express和apollo-server-core的版本是否一致,版本不一致会导致逻辑冲突,可执行以下命令重装统一版本的依赖:npm i apollo-server-express@latest apollo-server-core@latest
内容的提问来源于stack exchange,提问作者Roman Mahotskyi
相关产品推荐
相关产品推荐

