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

如何在Node.js项目中连接Heroku Postgres数据库?

搞定Heroku Postgres与Node.js的pg模块连接

嘿,我来帮你捋清楚怎么正确实现这个连接!首先得说,Heroku的Postgres有个很方便的特性——它会自动给你的应用注入DATABASE_URL环境变量,里面包含了所有连接需要的信息,所以其实不用手动拆分用户、密码这些参数,不过我也会把两种方式都讲清楚,你可以按需选。

方式一:直接用Heroku的DATABASE_URL(官方推荐,最省心)

这是最简单不容易出错的方式,直接用这个现成的连接字符串就行:

修改你的db-connect.js代码:

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

// 本地开发时,你可以在.env里加DATABASE_URL=你的本地Postgres连接字符串
// 但Heroku上不用管,它会自动设置这个变量
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  // 重点!Heroku免费层Postgres要求SSL连接,而且用的是自签名证书,所以得加这个配置
  ssl: {
    rejectUnauthorized: false
  },
  max: 10 // 保持你原来的连接池最大数配置
});

// 可以加个测试连接的代码,验证是否成功
pool.connect((err, client, release) => {
  if (err) {
    return console.error('获取连接失败:', err.stack);
  }
  client.query('SELECT NOW()', (err, result) => {
    release(); // 记得释放连接回池
    if (err) {
      return console.error('执行查询出错:', err.stack);
    }
    console.log('数据库连接成功!当前数据库时间:', result.rows[0].now);
  });
});

module.exports = pool;

为什么要加ssl配置?因为Heroku免费版的Postgres用的是自签名SSL证书,pg模块默认会拒绝这种未被信任的证书,所以关闭rejectUnauthorized才能正常连接。

方式二:继续用拆分的环境变量(适合本地调试)

如果你还是想保持按参数拆分的写法,那得确保本地和Heroku的环境变量都配置对:

第一步:获取Heroku的Postgres参数

打开终端,运行命令(替换成你的应用名):

heroku pg:credentials:url -a 你的Heroku应用名称

输出里会有user、host、database、password、port这些值,把它们复制到本地的.env文件里:

DB_USER=你的Heroku数据库用户名
DB_IP=你的Heroku数据库主机地址
DB=你的Heroku数据库名称
DB_PASSWORD=你的Heroku数据库密码
DB_PORT=5432

第二步:调整你的db-connect.js代码

const { Pool } = require('pg');
const nodeEnvFile = require("node-env-file");

// 只在本地开发时加载.env,Heroku上不需要(它已经自动设置了环境变量)
if (process.env.NODE_ENV !== 'production') {
  nodeEnvFile(".env");
}

const config = {
  user: process.env.DB_USER,
  host: process.env.DB_IP,
  database: process.env.DB,
  password: process.env.DB_PASSWORD,
  port: process.env.DB_PORT || 5432, // 给个默认值,防止本地没配置
  max: 10,
  // 生产环境(Heroku)开启SSL,本地不需要
  ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false
};

const pool = new Pool(config);

// 监听连接和错误事件,方便排查问题
pool.on('connect', () => {
  console.log('成功连上数据库啦');
});

pool.on('error', (err) => {
  console.error('数据库连接出问题了:', err);
});

module.exports = pool;

几个关键注意点

  • 别把.env文件提交到Git!一定要把它加入.gitignore,Heroku上不需要这个文件,它会自己管理环境变量。
  • 本地开发时,确保你的Postgres服务已经启动,而且.env里的参数和本地数据库匹配。
  • 连接池max设为10很合适,Heroku免费层的Postgres最多允许20个连接,10的池不会超限制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:38:04