将基于GraphQL的MERN应用部署到Heroku时遇应用错误
排查Heroku部署MERN应用的Application Error问题
1. 优先查看Heroku应用日志
登录Heroku CLI,执行以下命令获取实时错误日志:
heroku logs --tail --app enigmatic-castle-43725
日志会直接暴露启动失败的核心原因,比如端口绑定失败、数据库连接错误、依赖缺失等,是定位问题最有效的方式。
2. 检查server/index.js的关键配置
端口配置
必须使用Heroku动态分配的端口,不能硬编码固定值:
const PORT = process.env.PORT || 5000; app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
硬编码端口会导致Heroku无法正常启动服务。
静态文件服务配置
生产环境下需要让Express托管React构建后的静态资源,确保在所有路由配置前添加以下代码:
const path = require('path'); if (process.env.NODE_ENV === 'production') { // 托管静态文件 app.use(express.static(path.join(__dirname, '../client/build'))); // 非API路由返回React入口页面 app.get('*', (req, res) => { res.sendFile(path.resolve(__dirname, '../client/build', 'index.html')); }); }
注意要正确引入path模块,否则会出现路径错误。
GraphQL与数据库连接
- 确认GraphQL端点(如
/graphql)没有限制本地访问,生产环境下需允许外部请求。 - 检查数据库连接字符串(如MongoDB URI)是否通过Heroku环境变量正确读取,确保字符串无拼写错误,且数据库服务(如MongoDB Atlas)已将Heroku的IP加入白名单。
- 验证数据库连接代码在生产环境下能正常建立连接,避免因本地测试配置残留导致失败。
3. 验证package.json脚本配置
根目录package.json关键脚本
确保start脚本指向server入口文件,且heroku-postbuild脚本无语法错误:
"scripts": { "start": "node server/index.js", "heroku-postbuild": "NPM_CONFIG_PRODUCTION=false npm install --prefix client && npm run build --prefix client" }
- 确认server所需的依赖(如express、mongoose、apollo-server-express等)都放在
dependencies中,而非devDependencies,Heroku生产环境不会安装devDependencies内的包。
client目录package.json
本地执行npm run build --prefix client,验证是否能正常生成client/build文件夹,若本地构建失败,Heroku部署也会失败。
4. 环境变量检查
在Heroku应用设置的环境变量面板中,确认NODE_ENV=production、数据库URI、GraphQL相关变量等都已正确配置,无遗漏或拼写错误。
5. 本地模拟生产环境测试
在本地执行以下命令模拟生产环境运行,快速排查问题:
NODE_ENV=production npm start
若本地生产环境也出现错误,可直接在本地调试server/index.js,效率更高。
内容的提问来源于stack exchange,提问作者Jacob Berry
相关产品推荐
相关产品推荐

