如何在Vercel上同时运行apollo-server与Next.js项目?
解决方案
方案1:Next.js内置API路由集成Apollo Server(最推荐,无需单独启动服务)
该方案直接将Apollo Server嵌入Next.js原生路由中,和项目共用端口,无需单独启动独立服务,适配性最高,不会出现进程冲突问题。
- 安装对应依赖:
npm install @apollo/server @as-integrations/next graphql - 按你的路由模式编写Apollo入口:
- Pages Router:新建
pages/api/graphql.ts文件,写入Apollo Server配置和集成代码即可 - App Router:新建
app/api/graphql/route.ts文件,写入Apollo Server配置和集成代码即可
- Pages Router:新建
- 配置完成后直接执行
npm run dev,Apollo Server会随Next.js服务一同启动,访问路径为http://localhost:3000/api/graphql,开发和生产环境均无需额外调整。
方案2:多进程工具同时启动两个独立服务(适合必须拆分Apollo服务的场景)
你之前使用的node server & next dev命令失效的原因是Shell后台运行符&的进程调度逻辑存在IO阻塞问题,两个进程会争抢输入输出权限最终同时卡住,使用专门的多进程管理工具即可解决:
- 安装开发依赖:
npm install -D concurrently - 修改package.json中的scripts配置:
{ "scripts": { "dev": "concurrently \"npm run dev:next\" \"npm run dev:apollo\"", "dev:next": "next dev -p 3000", "dev:apollo": "node server.js" } }
- 额外注意将Apollo Server的监听端口配置为3000之外的端口(比如4000),避免端口冲突,之后直接执行
npm run dev即可同时正常启动两个服务。
部署问题修复
Serverless/Lambda部署
直接使用方案1的内置路由集成方式,无需单独部署Apollo服务,正常打包部署Next.js项目即可,Apollo Server会自动适配Serverless运行环境。
独立服务器部署
- 开发环境直接使用方案2的concurrently启动即可
- 生产环境推荐使用PM2管理两个进程,编写对应配置文件同时启动
next start和Apollo服务进程即可。
内容的提问来源于stack exchange,提问作者Zachary Toney
相关产品推荐
相关产品推荐

