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时出错