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

MERN栈项目部署Heroku白屏无报错,本地运行正常27次部署失败求助

核心问题定位

你遇到的Manifest: Line: 1, column: 1, Syntax error报错本质和manifest文件本身无关,是静态资源路由顺序错误导致:浏览器请求manifest.json时,服务端没有正确返回json文件,反而返回了React的index.html内容,JSON解析HTML自然触发语法错误。


可直接执行的修复方案

    1. 修正server.js的路由执行顺序,删除重复冗余的路由配置
      你当前把静态资源中间件写在了兜底路由之后,完全不符合Express的执行逻辑,而且重复写了多遍完全相同的get('*')/get('/*')兜底路由,调整后的逻辑顺序如下,删除所有重复代码:
// 原有中间件、数据库初始化、aws配置逻辑保留不变
const PORT = process.env.PORT || 5000; // 改回原端口配置,你之前改的process.argv[2]完全错误
mongoDB();

// 原有cors、bodyParser、xss、helmet、limiter等中间件配置保留不变
// 所有自定义接口路由(所有app.use("/xxx")的业务路由)保留不变,放在这一块

// !!!重点:静态资源中间件放在业务路由之后,兜底路由之前
app.use(express.static(path.join(__dirname, "client", "build")));

// 兜底路由只留1次,放在所有逻辑的最后,删除其他所有重复的get('*')/get('/*')
if (process.env.NODE_ENV === "production") {
  app.get('*', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
  });
}

// 跨域中间件你已经用了cors包,后面手写的那段跨域header中间件可以直接删掉,避免冲突
// app.listen逻辑保留不变
    1. 回退端口配置
      你之前把端口改成const port = process.argv[2];是错误操作,Heroku通过process.env.PORT环境变量传递端口,改回最初的const PORT = process.env.PORT || 5000;即可。
    1. 检查配置项加载逻辑
      你用了config包读取配置,该包默认读取本地config文件夹下的配置文件,如果你没有把生产环境的wasabiSecretAccessKey、数据库连接地址等敏感配置同步到Heroku后台的配置变量区,服务启动会直接崩溃。建议生产环境所有敏感配置直接读取process.env变量,不要依赖本地配置文件。
    1. 临时关闭helmet验证
      helmet默认的安全策略会拦截manifest.json的加载,你可以先注释掉app.use(helmet())这行代码测试部署,确认问题解决后再按需配置helmet的资源放行规则。
    1. 本地先做生产环境验证
      部署前先在本地跑生产模式验证:先进入client目录执行npm run build,再回到服务端根目录执行npm start,打开localhost:5000确认功能完全正常后再推送到Heroku,避免反复部署浪费时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:00:04