NodeJS Postgres错误getaddrinfo ENOTFOUND

时间:2016-01-15 00:25:53

标签: javascript postgresql express

我使用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();

6 个答案:

答案 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)

不确定这是否已放在那里,但它不会在我的密码中使用 $。删除它,它就像一个魅力。