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

Heroku免费层部署应用遇自签名证书错误求助

解决Heroku部署后应用错误及NODE_ENV=production下自签名证书问题

看起来你遇到了两个核心问题导致Heroku部署失败和本地production模式崩溃,我来帮你一步步拆解解决:

1. 首要问题:生产环境依赖缺失导致启动失败

你的package.json里的start脚本用了npx nodemon budget.js,但nodemon是devDependencies里的包,而你的heroku-postbuild命令执行的是npm install --production,这会跳过安装开发依赖。这意味着Heroku生产环境里根本没有nodemon,启动时必然报错,这是导致Heroku显示"应用错误"的关键原因之一。

修复方案:

修改你的scripts配置,把开发和生产的启动脚本分开:

"scripts": {
  "start": "node budget.js", // 生产环境用node直接启动
  "dev": "npx nodemon budget.js", // 本地开发用nodemon
  "heroku-postbuild": "npm install --production",
  "test": "echo \"Error: no test specified\" && exit 1"
}

2. TLS自签名证书错误:数据库连接的SSL配置问题

从报错信息Error: self signed certificate来看,你的应用在production模式下尝试连接一个使用自签名SSL证书的服务,结合你的依赖里的pg(PostgreSQL),大概率是数据库连接的SSL验证问题:

  • Node.js在production模式下会严格验证SSL证书的有效性,而development模式下可能默认宽松或者你本地有跳过验证的配置;
  • 如果是连接本地PostgreSQL(带自签SSL证书),或者Heroku Postgres的证书链在Node.js里无法被验证,都会触发这个错误。

修复方案:

修改你的PostgreSQL连接代码,针对不同环境配置SSL选项:

const { Pool } = require('pg');

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: process.env.NODE_ENV === 'production' 
    ? { rejectUnauthorized: false } // 适配Heroku Postgres或本地自签证书的生产测试
    : false // 开发环境关闭SSL验证
});

注意:rejectUnauthorized: false是Heroku官方文档推荐的针对Postgres连接的临时解决方案,因为Heroku Postgres的证书虽然合法,但有时Node.js的证书链会出现验证问题。如果是生产环境连接外部可信服务,不要使用这个配置,应该确保证书被正确信任。

3. 额外排查步骤

  • 检查Heroku环境变量:确认Heroku上已经配置了所有必要的环境变量(比如DATABASE_URL、SESSION_SECRET等),可以通过heroku config命令查看,缺失的变量用heroku config:set KEY=VALUE添加;
  • 查看Heroku日志:执行heroku logs --tail可以实时查看应用的报错信息,这能帮你快速定位其他潜在问题;
  • 本地production模式测试:修改完上述配置后,重新运行NODE_ENV=production heroku local,应该能正常启动,再推送代码到Heroku测试。

按照以上步骤修复后,Heroku应用应该能正常启动,本地production模式的崩溃问题也会解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:42:31