You need to enable JavaScript to run this app. 升级apollo-server到v3后调用applyMiddleware报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 07:27:02