用于Nodejs应用程序的Heroku Postgres插件连接字符串



我在使用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进行了硬编码)

谢谢你的帮助!

首先,我会避免使用new Client(),因为这可能会导致您的连接堵塞。相反,请使用连接池。你可以在这里读到一个更深入的答案来解释你为什么要这么做。

至于你的直接问题,我个人过去在连接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连接字符串。

最新更新