我在使用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)
感谢您的帮助!
答案 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连接字符串。