Nodejs 应用程序的 Heroku Postgres 附加连接字符串
Posted
技术标签:
【中文标题】Nodejs 应用程序的 Heroku Postgres 附加连接字符串【英文标题】:Heroku Postgres add-on connection string for Nodejs app 【发布时间】:2018-04-28 01:49:49 【问题描述】:我在使用 Postgresql 数据库部署 Nodejs 应用程序时遇到问题。该数据库来自 Heroku 本身(Heroku Postgres 插件,爱好开发)。我的应用拒绝连接到数据库。
我找到了问题的根源,但找不到干净的解决方案。而且我想我可能误解了一些东西(我是 Node 和 Heroku 的新手)。
Heroku 自动给我一个环境变量 DATABASE_CONFIG,其中包含端口:
postgres://username:password@hostname:port/databasename
然后,为了在我的应用程序中连接 pg,我使用 process.env.DATABASE_CONFIG 作为连接字符串。我会这样做:
const client = new Client(
connectionString: connectionString,
)
client.connect()
连接失败。
但是如果我不使用这个环境变量,而是作弊并更改它,从这个连接字符串中删除端口号,它就可以工作。
我不知道为什么,但问题是 Heroku 为您提供了包含端口的 DATABASE_URL,您无法更改它。
我做错了吗?有没有一个干净的解决方案来避免这种情况?
(因为我所做的很丑陋,因为我在代码中直接硬编码了没有端口的 DATABASE_CONFIG)
感谢您的帮助!
【问题讨论】:
【参考方案1】:首先,我会避免使用new Client()
,因为这会导致您的连接出现瓶颈。相反,使用连接池。您可以阅读更深入的答案,了解您为什么要这样做here。
至于你的直接问题,我个人在过去连接到 heroku postgres 数据库时遇到了麻烦,但这是一个(基本)典型设置,99% 的时间都适用于我:
let pg = require('pg');
if (process.env.DATABASE_URL)
pg.defaults.ssl = true;
// include an OR statement if you switch between a local dev db and
// a remote heroku environment
let connString = process.env.DATABASE_URL || 'postgresql://postgres:password@localhost:localpostgresport/yourlocaldbname';
const Pool = require('pg');
const pool = new Pool(
connectionString : connString
);
我的第一个猜测是它可能与未启用 ssl 有关。我知道这在过去给我造成了问题。其次,您要确保使用process.env.DATABASE_URL
,因为环境变量应由 Heroku 设置为 postgres 连接字符串。
【讨论】:
嗨,我已经找到问题所在了。这是答案的最后一部分。我使用的是 DATABASE_CONFIG 而不是 DATABASE_URL (不包含端口)。我不敢相信这是那么简单,我看不到它。感谢您的帮助! 当然!有时设置 Heroku 可能会很棘手。我很高兴你能弄清楚:) 非常感谢您的帮助!以上是关于Nodejs 应用程序的 Heroku Postgres 附加连接字符串的主要内容,如果未能解决你的问题,请参考以下文章
如果应用程序崩溃,heroku 是不是会重新启动 NodeJS 服务器