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

Node.js应用连接Heroku PostgreSQL数据库失败求助

解决Heroku PostgreSQL连接超时(H12)及查询失败问题

核心问题排查与修复

1. SQL语法错误导致查询异常

你的/test端点SQL语句存在语法错误:

db.any("SELECT * Demo LIMIT 10")

缺少FROM关键字,正确写法应为:

db.any("SELECT * FROM Demo LIMIT 10")

语法错误会导致数据库查询卡住或报错,进而引发请求超时。

2. 未返回客户端响应触发H12超时

/test端点执行数据库操作后,未调用res.send()或res.end()向客户端返回结果,请求会一直挂起,最终触发Heroku的H12请求超时错误。修改后的/test端点代码:

app.get("/test", (req, res) => {
    console.log('testing')
    db
      .any("SELECT * FROM Demo LIMIT 10")
      .then((data) => {
        console.log(data);
        res.send({ success: true, data: data }); // 返回请求响应
      })
      .catch((err) => {
        console.error(err);
        res.send({ success: false, error: err.message }); // 错误场景也要返回响应
      });
    // 禁止调用db.$pool.end(),该操作会关闭整个数据库连接池,导致后续请求完全失效
});

3. 改用Heroku官方推荐的连接方式(替代手动配置)

手动配置host、user等信息易出错,且Heroku可能动态调整数据库连接信息,正确做法是直接使用Heroku提供的DATABASE_URL环境变量:

const pgp = require('pg-promise')();
// 直接从环境变量获取完整连接字符串,自动处理SSL等配置
const db = pgp(process.env.DATABASE_URL);

// 验证数据库连接
db.connect()
  .then(obj => {
    console.log('数据库连接成功');
    obj.done(); // 释放连接
  })
  .catch(err => {
    console.log('连接失败:', err.message);
    process.exit(1);
  });

DATABASE_URL已包含所有必要连接信息,无需手动设置SSL参数。

4. 升级依赖解决版本兼容性问题

你的依赖均为5年前的旧版本,可能与Heroku当前PostgreSQL版本不兼容,尤其是SSL连接和协议支持方面。更新package.json依赖:

"dependencies": {
  "body-parser": "^1.20.2",
  "express": "^4.18.2",
  "form-data": "^4.0.0",
  "pg": "^8.11.3",
  "pg-promise": "^11.5.4",
  "request": "^2.88.2"
}

删除无用的mysql和npm依赖,执行npm install完成更新。

额外注意事项

  • 确认Heroku已正确配置PostgreSQL附加组件,通过heroku config:get DATABASE_URL命令验证环境变量是否存在。
  • 本地测试时,可通过dotenv包加载.env文件中的DATABASE_URL值,模拟Heroku环境。
  • 查看Heroku实时日志定位问题:heroku logs --tail,日志会输出具体的数据库连接或查询错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:03:21