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 附加连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

将nodejs部署到heroku

将 nodejs/mongoose 部署到 heroku

如果应用程序崩溃,heroku 是不是会重新启动 NodeJS 服务器

为啥 react+nodejs 应用程序部署到 heroku 显示应用程序错误?

无法将 nodejs 应用程序部署到 heroku

Heroku上NodeJs应用程序中的H12请求超时错误?