使用TypeORM的Node.js应用无法连接Heroku上的PostgreSQL数据库如何解决?
报错原因
两个报错的触发逻辑如下:
- ssl设为false:Heroku Postgres服务端强制要求客户端使用SSL连接,关闭SSL会直接被服务端拒绝,因此抛出
pg_hba.conf相关的连接错误 - ssl设为true:Heroku的数据库使用自签名证书,Node.js默认的TLS校验规则会拒绝不受信任的自签名证书,因此报自签名证书错误
解决方案
TypeORM的PostgreSQL连接配置中,ssl参数支持传入配置对象,你可以通过配置关闭自签名证书校验,同时建议区分开发、生产环境的配置,避免影响本地开发的数据库连接。
修改后的完整配置如下:
import { createConnection } from 'typeorm'; ... export const databaseConnection = async (databaseURL:string) => { try { await createConnection({ type: "postgres", url: databaseURL, entities: [User], // 生产环境建议关闭 synchronize,改用迁移脚本同步表结构避免数据丢失 synchronize: process.env.NODE_ENV !== 'production', ssl: process.env.NODE_ENV === 'production' ? { rejectUnauthorized: false } : false }); } catch (error) { console.error('数据库连接失败:', error) } }; // Heroku 开通Postgres插件后会自动注入DATABASE_URL环境变量,无需手动填写 databaseConnection(process.env.DATABASE_URL)
注意事项
生产环境务必关闭synchronize配置,该配置会自动对比实体和数据库表结构并修改表定义,可能触发数据丢失风险,建议使用TypeORM官方的Migration功能做表结构同步。
内容的提问来源于stack exchange,提问作者mykoman
相关产品推荐
相关产品推荐

