如何在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
相关产品推荐
相关产品推荐

