NodeJS Postgres 错误 getaddrinfo ENOTFOUND

Posted

技术标签:

【中文标题】NodeJS Postgres 错误 getaddrinfo ENOTFOUND【英文标题】:NodeJS Postgres error getaddrinfo ENOTFOUND 【发布时间】:2016-04-20 12:45:06 【问题描述】:

我使用 pg://user:pass@localhost:port/table 连接到我的 AWS 数据库。当我使用 localhost 时,该应用程序运行良好,但当我尝试连接 AWS 服务器时,它就崩溃了。

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

错误: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();

【问题讨论】:

只是为了澄清您是否尝试从运行数据库的机器连接?或者当您收到该错误时来自其他主机? 您需要正确指定服务器地址。参考这个链接:***.com/questions/23259697/… 我在本地运行应用程序并尝试连接 aws db 实例端点。 这能回答你的问题吗? Node.js getaddrinfo ENOTFOUND 【参考方案1】:

如果您确定您的连接字符串已经像上面描述的 gnerkus 那样格式正确,那么您需要检查的最后一件事就是您的密码。如果它包含非字母数字字符,则可能是导致问题的原因。似乎是 Node.js 或 javascript 本身的工作方式导致了这种情况(我不太确定,因为 pg-admin 可以使用我的初始密码进行连接)。

我的密码包含 '+''/' (通过创建一个充满乱码的长 json 然后对其进行哈希处理得到 base64 字符串),我确实收到了和你一样的错误。一旦我摆脱它(从我的连接字符串并更新我的数据库密码),它就可以正常工作了。

哦,还有……'=' 被接受了。因为似乎问题出在数据库端的 url 解码过程上。当我发送'+' 时,我认为它被' ' 替换,这会导致密码错误。 '/' 导致了格式错误的 url,这是我们错误的根本原因(表示未找到)。看看这个例子。

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

我相信你会意识到有额外的'/' 会导致错误的 URL 崩溃。所以,protocol:// user:pass@host / database 变成了protocol:// [malformed user:pass@host] / [malformed database name] / [some gibberish],因为多了一个'/'

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

编辑: 或者更好的是,根据讨论here,尝试对连接字符串的密码部分进行编码。他们说它有效。因为我已经更改了密码,所以我没有费心去尝试。由于您仍然遇到此问题,因此您可能需要先尝试一下,然后再执行我上面的两个建议之一。

【讨论】:

感谢您的意见!我的密码有问题,我已修复。事实证明,“#”不被接受,而是“!”是。 密码中的#符号也是我的问题。感谢您的补充。 @Andi-lo 是的。嗯.. 基本上,所有 uri 符号都是问题所在。要么删除它,要么对密码部分进行 url 编码。【参考方案2】:

对您的密码进行编码。

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 以供访问。我重构了我的代码,结果发现我提供的连接信息没有被应用。我收到以下错误。 could not connect to postgres [Error: getaddrinfo ENOTFOUND myapp myapp:5432] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo', hostname: 'myapp', host: 'myapp', port: 5432 【参考方案4】:

确保您的网址不包含http://

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

如果它对任何人有帮助,我在尝试使用 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://),它开始工作了。

【讨论】:

以上是关于NodeJS Postgres 错误 getaddrinfo ENOTFOUND的主要内容,如果未能解决你的问题,请参考以下文章

在nodejs中连接到heroku postgres db时出错

nodejs连接postgres

nodejs连接postgres

node-postgres: [错误] 此套接字已被对方结束

NodeJS 加密到 Postgres 的连接字符串

NodeJS/Sequelize/MySQL - 为啥需要 postgres 依赖项?