You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署在Heroku的MERN应用依赖本地服务器,停止本地服务即失效问题排查

问题原因及解决办法

核心问题分析

你的Heroku应用依赖本地服务器,本质是前端请求指向本地、后端配置未适配生产环境导致的,结合你的package.json和MERN部署逻辑,具体问题和修复方案如下:

1. 前端API请求地址写死为本地

前端代码里的接口请求大概率硬编码成了http://localhost:xxxx(比如axios.get('http://localhost:5000/api/data')),部署到Heroku后,前端仍然会请求你本地的服务器,一旦本地服务器关闭,请求就会失败。

修复:
把所有API请求改成相对路径,比如将上述请求改为axios.get('/api/data'),这样部署后会自动请求Heroku应用域名下的后端接口。

2. package.json的生产启动脚本错误

你的start:prod脚本用了Windows的SET命令:

"start:prod": "SET NODE_ENV=production&& server.js"

但Heroku运行在Linux环境下,这种写法不生效,而且Heroku默认执行npm start脚本,如果你的生产环境依赖这个脚本,会导致后端没有以生产模式启动,可能加载了本地的配置(比如本地数据库地址)。

修复:
修改start或start:prod脚本为Linux兼容写法,比如直接把start脚本改成生产环境启动:

"start": "NODE_ENV=production node server.js"

确保Heroku启动的是生产模式的后端服务。

3. 未在Heroku配置生产环境变量

本地的.env文件里的数据库连接字符串(比如MONGODB_URI=mongodb://localhost:27017/careplan)没有同步到Heroku,导致后端尝试连接本地MongoDB,一旦本地数据库关闭,应用就会崩溃。

修复:

  1. 登录Heroku控制台,进入你的应用页面
  2. 打开Settings -> Config Vars
  3. 添加本地.env里的所有必要变量,比如MONGODB_URI(替换为线上数据库地址,比如MongoDB Atlas的连接字符串)、JWT_SECRET等

4. 后端未正确托管前端静态文件

MERN应用部署时,后端需要在生产环境下提供前端build后的静态文件,如果你的server.js里没有相关逻辑,前端可能仍在依赖本地的开发服务器。

修复:
在server.js中添加生产环境的静态文件托管代码:

const path = require('path');

if (process.env.NODE_ENV === 'production') {
  // 托管前端build文件夹
  app.use(express.static(path.join(__dirname, 'client', 'build')));

  // 所有非API请求返回前端index.html
  app.get('*', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
  });
}

内容的提问来源于stack exchange,提问作者oladimeji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:21:12