我使用pg://user:pass@localhost:port/table
连接到我的AWS数据库。当我使用localhost时,该应用程序工作正常,但当我尝试连接AWS服务器时,它崩溃了。
即使是简单的连接代码也会给我这个错误。 数据库名称是人员,它在端口8080上运行,但在此错误中它显示5432,即使我在conString中声明了正确的端口号。
错误:getaddrinfo ENOTFOUND people people:5432 在errnoException(dns.js:26:10) 在GetAddrInfoReqWrap.onlookup [as oncomplete](dns.js:77:26)
到目前为止,这是我的代码:
var pg = require("pg");
var conString = "pg://someuser:pass@db-endpoint:8080/postgres";
var client = new pg.Client(conString);
client.connect();
答案 0 :(得分:9)
如果您确定您的连接字符串已经像所描述的gnerkus一样格式良好,那么您需要检查的最后一件事是您的密码。如果它包含非字母数字字符,那么可能是导致该问题的人。似乎Node.js或javascript的工作方式导致这种情况(我不确定,因为pg-admin可以使用我的初始密码连接就好了。)
我的密码包含'+'
和'/'
(通过创建一个填充了乱码的长json然后哈希得到base64字符串获得)并且我确实收到了与您相同的错误。一旦我摆脱它(从我的连接字符串和更新我的数据库的密码),它工作正常。
哦,然而...... '='
被接受了。因为似乎问题在于数据库端的url解码过程。当我发送'+'
时,我认为它被' '
取代,这会导致密码错误。并且'/'
导致格式错误的url,这是我们错误的根本原因(未找到)。看一下这个例子。
postgres://username:sdkadady88da8+8ahdajd/ashdi==@localhost/database
我相信你会发现有额外的'/'
会导致错误的网址崩溃。因此,protocol:// user:pass@host / database
由于额外protocol:// [malformed user:pass@host] / [malformed database name] / [some gibberish]
而变为'/'
。
如果使用JSF访问它的同事可以编辑他们的连接字符串,我建议将密码更新为两者都接受的密码。如果他们不能,那么您需要创建另一个具有相同访问权限但可以在Node.js中使用的不同密码的用户/角色。
编辑: 或者更好的是,根据讨论here,尝试编码连接字符串的密码部分。他们说它有效。因为我已经更改了密码,所以我没有费心去尝试。由于您仍然遇到此问题,因此在执行上述两项建议之前,您可能需要先尝试一下。
答案 1 :(得分:4)
对密码进行编码。
const userPasswordDatabase = `${encodeURIComponent(database.dbPassword)}@`;
答案 2 :(得分:1)
Postgres数据库连接的默认端口是5432. AWS上的Postgres数据库可能正在该端口上运行。此外,连接字符串应采用以下格式:
var conString =" postgres:// username:password @ localhost / database&#34 ;;
在node-postgres文档中定义。您应该将连接字符串更新为:
var conString = "postgres://someuser:pass@db-endpoint:5432/people";
答案 3 :(得分:0)
确保您的网址不包含http://
答案 4 :(得分:0)
如果对任何人都有用,我会遇到这个问题,尝试使用pg npm软件包从Heroku上托管的API连接到AWS上的postgres数据库。我将PGHOST环境变量从https://aws-sondayy-prod.caoqasdfsdftwur.us-east-2.rds.amazonaws.com更改为aws-sondayy-prod.caoqasdfsdftwur.us-east-2.rds.amazonaws.com(即删除了https://),它开始起作用。
答案 5 :(得分:0)
不确定这是否已放在那里,但它不会在我的密码中使用 $。删除它,它就像一个魅力。