升级Node.js至14及apollo-server-express到3.5.0迁移问题咨询
问题核心原因
你遇到的报错是Apollo Server v3的强制规则:v3为了支持异步启动逻辑(例如加载远程schema、异步初始化插件等),不再允许在服务启动前挂载中间件,必须先显式执行await server.start()后才能调用server.applyMiddleware()。
同时你当前使用的graphql-tools包属于旧版本整合包,已经被官方拆分,后续不再维护,也需要同步替换。
迁移修复步骤
- 第一步:调整服务启动逻辑
你当前的代码将Apollo Server实例直接导出,需要修改引入该实例的Express入口文件,将挂载逻辑包裹在异步函数中,先启动服务再挂载中间件,参考代码如下:
const express = require('express'); const server = require('./你导出server的文件路径'); const app = express(); async function startService() { // 优先启动Apollo服务 await server.start(); // 再挂载中间件到Express实例 server.applyMiddleware({ app }); app.listen(4000, () => { console.log(`服务已启动,GraphQL地址:http://localhost:4000${server.graphqlPath}`); }); } startService();
- 第二步:替换过时依赖
makeExecutableSchema方法现在维护在@graphql-tools/schema包中,操作如下:
- 卸载旧依赖:
npm uninstall graphql-tools - 安装新依赖:
npm install @graphql-tools/schema - 修改原有导入语句即可,schema生成逻辑完全兼容,不需要额外修改:
// 替换前 const { makeExecutableSchema } = require('graphql-tools'); // 替换后 const { makeExecutableSchema } = require('@graphql-tools/schema');
- 第三步:按需调整其他兼容配置
如果你的项目用到了以下配置,需要同步调整:- CORS配置:如果之前在
ApolloServer构造参数中配置了cors,需要将该配置移动到applyMiddleware的参数中,示例:server.applyMiddleware({ app, cors: 你的cors配置对象 }) - playground/内省开关:Apollo Server v3生产环境默认关闭GraphQL playground和schema内省,如果需要保留需要在
ApolloServer构造参数中显式开启:
const server = new ApolloServer({ introspection: true, playground: true, // 其他原有配置 }) - CORS配置:如果之前在
是否需要全量重构Apollo相关模块
完全不需要,你当前的代码适配v3的改动点不超过10行,全量重构反而会引入不必要的风险和额外工作量。只有当你原有Apollo相关逻辑存在大量耦合、需要同时重构整体GraphQL架构时,才考虑全量重写。
内容的提问来源于stack exchange,提问作者Ethanolle
相关产品推荐
相关产品推荐

