Heroku Postgres为Nodejs app添加连接字符串

时间:2017-11-14 23:51:29

标签: node.js postgresql heroku

我在使用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 个答案:

答案 0 :(得分:0)

首先,我会避免使用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连接字符串。