You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Heroku上Node.js应用Procfile未被识别,部署失败求助

排查Heroku部署Node.js应用的常见问题

从你的描述来看,构建日志显示webpack打包完成了,但应用空白、构建不结束且没有dynos实例化,这几个问题我处理过不少,大多和端口配置、启动命令、构建流程有关,给你拆解几个排查方向:

1. 别硬编码localhost和固定端口,用Heroku动态分配的端口

Heroku不会让你用localhost或者固定的5000端口,必须读取环境变量里的PORT,同时要绑定到0.0.0.0才能让外部请求进来。修改你的server.ts监听代码:

const port = process.env.PORT || 5000; // 本地开发用5000,Heroku用分配的端口
app.listen(port, '0.0.0.0', () => {
  console.log(`Node server listening on port ${port}`);
});

之前用localhost的话,Heroku的路由层根本访问不到你的服务,自然是空白页面。

2. 确保Heroku知道怎么启动你的应用

Heroku需要明确的启动指令,两种方式二选一就行:

  • 添加Procfile文件(项目根目录下,无后缀),内容要对应你的打包输出路径:
    web: node dist/server/main.bundle.js
    
  • 在package.json里配置start命令
    "scripts": {
      "start": "node dist/server/main.bundle.js",
      "build": "webpack --mode production",
      "postinstall": "npm run build" // 让Heroku安装依赖后自动执行构建
    }
    
    要是没加postinstall,Heroku可能只会装依赖,不会帮你跑构建脚本,自然找不到可执行的bundle文件。

3. 检查构建是否被watch模式卡住了

你说“构建从未结束”,大概率是webpack开了watch模式——生产构建时watch会让进程一直运行,Heroku会认为构建还在进行,不会启动dyno。修改webpack配置:

// webpack.config.js
module.exports = {
  // ...其他配置
  watch: process.env.NODE_ENV !== 'production', // 生产环境强制关闭watch
};

也可以看构建日志最后几行,如果有“webpack is watching the files...”的提示,直接确认就是这个问题。

4. 查看dyno启动日志,抓隐藏的启动错误

有时候构建成功了,但启动时会有代码错误、依赖缺失之类的问题,Heroku会悄悄停止dyno。用Heroku CLI看实时日志:

heroku logs --tail

这里能看到启动时的所有报错,比如找不到bundle文件、未捕获的异常,这些在构建日志里是看不到的。

最后验证步骤

  1. 本地先跑npm run build,再执行npm start,确保本地能正常启动并访问;
  2. 推送修改后,用heroku ps查看dyno状态,如果显示web.1: up,说明启动成功了。

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

火山引擎 最新活动