Node.js Heroku/Postgres“;“客户身份验证”;节点和节点postgres出错

Node.js Heroku/Postgres“;“客户身份验证”;节点和节点postgres出错,node.js,postgresql,heroku,heroku-postgres,node-postgres,Node.js,Postgresql,Heroku,Heroku Postgres,Node Postgres,我正处于使用Postgres在Heroku上开发应用程序的早期阶段。NodeJS中问题代码的一个简单版本是: const{Client}=require('pg'); const client=new client({connectionString:'postgres://{username}:{password}@{host}:5432/{dbname}}); client.connect(); const result=client.query('SELECT now()'); clien

我正处于使用Postgres在Heroku上开发应用程序的早期阶段。NodeJS中问题代码的一个简单版本是:

const{Client}=require('pg');
const client=new client({connectionString:'postgres://{username}:{password}@{host}:5432/{dbname}});
client.connect();
const result=client.query('SELECT now()');
client.end();
connectionString
是data.heroku.com的凭据窗格中提供的字符串的副本,已检查并重新检查。我可以:

  • 使用来自多个不同本地应用程序(例如DataGrip)的连接字符串进行连接
  • 使用该代码(使用不同的连接字符串)连接到Docker映像中运行的本地版本的Postgres
我不能:

  • 从本地计算机上的节点应用进行连接
  • 从部署到Heroku的节点应用程序进行连接
当代码对远程数据库失败时,节点postgres抛出以下错误:

{
“长度”:168,
“名称”:“错误”,
“严重性”:“致命性”,
“代码”:“28000”,
“文件”:“auth.c”,
“行”:“496”,
“例程”:“客户端身份验证”
}
使用节点v14.15.1,节点postgres(“pg”)8.5.1

更新:
可能还值得一提的是,我在Java中找不到使此连接失败的方法…这个错误肯定在Node postgres[底层postgres驱动程序]Heroku中的某个地方(即,数据库正常,连接正常)…但是在哪里?

添加
ssl:{rejectUnauthorized:false}
创建
客户端时
对象为我解决了这个问题。()


也许可以尝试添加
extra:{ssl:{rejectUnauthorized:false}}
,如果其他代码没有修复任何问题()

在Heroku支持的帮助下,我能够找到基于的解决方案。“解决方案1”对我来说没有任何改变,但“解决方案2”(使用
pg连接字符串
)确实有效

Fwiw值得一提的是,我还使用了一个基于NODE_ENV环境变量的条件来包装SSL,这样代码既可以用于Heroku Postgres实例,也可以用于同一数据库的本地开发版本。即:

//将此逻辑集中化,以便可以重用“useLocalDb”
//在模块中的多个功能中(如果逻辑需要更改
//后来,除其他原因外)
const useLocalDb=process.env.USE\u LOCAL\u DB;
//工作连接代码的简短版本
const{Pool}=require('pg');
const{parse}=require('pg-connection-string')
const config=parse(process.env.DATABASE\u URL)
如果(!useLocalDb){
config.ssl={
拒绝:错误
}
}
const pool=新池(配置);

Hi,@Paul……不幸的是,这不起作用。Fwiw如果从Java内部调用,我无法使这个连接失败,所以我倾向于认为这不是SSL/cert问题。想想看,这是一个值得添加到原始帖子中的数据点……嗨@RiqueW。你是说JavaScript吗?另外,字符串'postgres://{username}:{password}@{host}:5432/{dbname}'正是您使用的代码,或者您只是想隐藏凭据?嘿,@Paul…我指的是Java本身,不是Javascript,只是一个测试此连接的小实用程序。有趣的是,当我说我可以从桌面客户端连接时,我认为他们都在使用JDBC驱动程序,所以有一个共同点。是的,这些只是路径中的模糊变量。我最初使用的是Heroku提供的URL,并且一直在使用一些我认为可能有用的小变体,但到目前为止:nothingHey@Paul…Your's Response离我很近,应该已经起作用了,依我看。我不确定为什么我在下面发布的基于Heroku支持的答案使用“pg连接字符串”会起作用(但我现在就接受它)
const client = new Client({
    connectionString: 'postgres://{username}:{password}@{host}:5432/{dbname}',
    ssl: { rejectUnauthorized: false }
});