NodeJS Postgres错误getaddrinfo ENOTFOUND

28

我使用 pg://user:pass@localhost:port/table 连接我的 AWS 数据库。当我使用 localhost 时,应用程序可以很好地工作,但是当我尝试连接 AWS 服务器时它就失败了。

即使是一个简单的连接代码也会给我这个错误。 数据库名称为 people,正在端口 8080 上运行,但在此错误中它显示为 5432,即使我在 conString 中声明了正确的端口号也是如此。

Error: getaddrinfo ENOTFOUND people people:5432 at errnoException (dns.js:26:10) at 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();

只是为了澄清,您是在尝试从运行数据库的机器上连接吗?还是在出现错误时从不同的主机上连接? - enderv
你需要正确指定服务器地址。参考此链接:https://dev59.com/zmAg5IYBdhLWcg3wu87o - Shubham Batra
我正在本地运行应用程序,尝试连接 AWS 数据库实例端点。 - arkhários
这个回答解决了你的问题吗?Node.js getaddrinfo ENOTFOUND - Henke
10个回答

30

如果你确定你的连接字符串已经像gnerkus描述的一样格式良好,那么你需要检查的最后一件事就是你的密码。如果它包含了非字母数字字符,也许就是导致问题的原因。似乎是 Node.js 或者 javascript 本身的处理方式引起了这个问题(我不太确定,因为 pg-admin 可以使用我的初始密码正常连接)。

我的密码包含 '+''/'(通过创建一个填充了无意义内容的长 JSON 然后对其进行哈希,得到 base64 字符串获得),我确实收到了和你一样的错误。一旦我把它们从我的连接字符串中删除,并更新我的数据库密码,它就可以正常工作了。

哦,对了...'=' 是被接受的。因为问题似乎出在数据库端的 URL 解码过程上。当我发送 '+' 时,它似乎被替换成了 ' ',这将导致密码不正确。而 '/' 则会导致 URL 格式错误,这就是我们错误的根本原因(显示未找到)。请看下面的例子。

postgres://username:sdkadady88da8+8ahdajd/ashdi==@localhost/database

我相信您会意识到有额外的 '/',这将导致错误的URL分解。因此,protocol://user:pass@host/database 变为 protocol://[格式错误的 user:pass@host]/[格式错误的数据库名称]/[一些无意义的字符] ,因为有多余的 '/'

如果使用JSF访问它的同事可以编辑他们的连接字符串,我建议更新密码为两者都接受的密码。如果他们不能,则需要创建另一个具有相同访问权限但具有不同密码的用户/角色,可从Node.js中使用。

编辑: 或者更好的方法是,根据在此处的讨论,尝试对连接字符串的密码部分进行编码。他们说这个方法有效。由于我已经更改了我的密码,所以我没有费心去尝试。既然您还有这个问题,您可能想在执行我上面提供的两个建议之前先尝试它。


2
感谢您的输入!我遇到了一个密码问题,但已经解决了。原来“#”是不被接受的,但是“!”可以。 - arkhários
密码中的“#”符号也是我的问题所在。感谢您的补充。 - Andi-lo
2
@Andi-lo 是的。嗯...基本上,所有的URI符号都是问题所在。要么删除它,要么对密码部分进行URL编码。 - Firanto

12
在我的场景中,我正在与docker容器建立数据库连接。我使用了错误的DB_HOST,而是使用了docker服务名称作为DB_HOST,而不是localhost。
更正了DB_HOST后,该问题得到解决。
错误的.env设置: DB_HOST=postgres 正确的.env设置: DB_HOST=localhost

10

加密您的密码。

const userPasswordDatabase = `${encodeURIComponent(database.dbPassword)}@`;

3
默认的Postgres数据库连接端口是5432。AWS上的Postgres数据库很可能在该端口上运行。同时,连接字符串应该采用以下格式:

var conString = "postgres://username:password@localhost/database";

这是在node-postgres文档中定义的。你应该更新你的连接字符串为:
var conString = "postgres://someuser:pass@db-endpoint:5432/people";

我的同事使用他的JSF应用程序可以很好地访问数据库。我们已将端口更改为8080以进行访问。我重构了我的代码,结果发现我提供的连接信息没有被应用。我收到以下错误。 无法连接到postgres {[错误:getaddrinfo ENOTFOUND myapp myapp:5432] 代码:'ENOTFOUND', errno:'ENOTFOUND', syscall:'getaddrinfo', 主机名:'myapp', 主机:'myapp', 端口:5432} - arkhários

2

请确保您的URL不包含http://


2

不确定是否已经有人提出过,但我的密码中不能包含$符号。删除后,它就像魔术一样起作用了。


2

留在这里,以防有人和我遇到相同的问题

我把127.0.0.1:5432放错成了127.0.0.1


1

在传递主机给连接池类时,你可能写了一个"@"符号,请记住它应该像这样 "地址字符串" 而不是像这样 "@地址字符串"。


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

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://),然后它开始正常工作。

0
几乎总是密码的问题,将其保持为一个简单的字符串,包含字母和数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接