nodejs httprequest与数据 – 获取错误getaddrinfo ENOENT
更新 – 自我回答我看到一个人必须确保从机器上正确parsingDNS,检查这个代码,以确保URL是可达的nodejs.org/docs/latest/api/dns.html#dns.resolve
原来的问题
我正在编写一个基于节点的程序,在这个程序中,用户可以要求我代表他执行一个httprequest(当然,他们提供了一些数据和方法来调用),但是每次我做一个httprequest,它都会给我一个错误
getaddrinfo ENOENT这是我的代码的外观
function makehttprequest(deviceid, httpaction, httppath,methods, actiondata, callback) { console.log('we are here with httpaction' + httpaction + ' path ' + httppath + ' method ' + methods + ' action data ' + actiondata); //do the http post work, get the data, and call the callback function with return data var options = { host: httpaction, port: 80, path: httppath, method: methods }; try { var req = http.request(options, function(res) { console.log('STATUS: ' + res.statusCode); console.log('HEADERS: ' + JSON.stringify(res.headers)); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('BODY: ' + chunk); }); }); } catch(e) { console.log('error as : ' + e.message); } req.on('error', function(e) { console.log('problem with request: ' + e.message); }); // write data to request body console.log('writing data to request ..'); req.write(actiondata); console.log('finished writing data to request…'); req.end(); console.log('request ended…'); }
我已经看到这种情况发生在你的主机(你通过httpaction传入)的前面有scheme(如“http://”)。 您的主机应严格按照“www.google.com”而不是“ http://www.google.com ”或“www.google.com/hello-world”或“ http://www.google.com”; /你好,世界 “。
保持它只是域。
以下是一个示例: http : //allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html
如果您有一个斜线,也会发生问题:
好: "www.google.com"
不好: "www.google.com/"
通过使用request
模块而不是http
来避免所有这些主机名/协议/端口/斜线问题
我得到[错误:Getaddrinfo ENOENT],但它是正确的后得到[错误:连接EMFILE]; 因为我正在做数以千计的客户端的负载testing,EMFILE错误(根本原因)是不透明的。 解决scheme与EMFILE相同 :增加文件描述符的数量。 只要在这里添加完整性,以防其他人有相同的问题。
我今天又犯了一个愚蠢的错误。 这是因为端口号是作为主机名的一部分。
// wrong. gets error getaddrinfo ENOENT var options = { hostName: 'localhost:1337', .... } // correct var options = { hostname: 'localhost', port: 1337, };
在调用server.listen(PORT, HOST);
时出现这个错误server.listen(PORT, HOST);
HOST无法parsing回本地机器。
一旦我把它改回到本地机parsing的主机名/域名/ IP,这个错误就消失了。
由于我试图通过主机名连接来达到开发目的,我添加了一个条目到我的主机文件中,并且保证了所需的主机名,并且确保这个条目与传递给server.listen()
的主机名匹配。
如果你所有的代码看起来都没问题,而你仍然得到同样的错误,那么我的解决scheme就是检查/etc/resolv.conf
文件中的名称服务器。
我在我的resolv.conf
文件(8.8.8.8)的开头添加了Google的名称服务器,代码再次正常工作,没有更多的错误。
值得注意的是,在我运行sudo apt-get upgrade
,2015年2月4日发生了这个错误,我的节点js必须更新,并且引入了一个错误,这个错误似乎与我所使用的名称服务器不兼容。
起初,我通过在命令行中使用wget
获取我需要的URL来检查是否有任何DNS问题,我得到了目标url的内容,所以我不认为它实际上是一个DNS问题,但它是。
我有一个类似的问题,但作为AWS Lambda函数运行,所以如果有人遇到与Lambda函数有关的问题,这就是我如何解决这个问题。
- 为您的Lambda函数提供一个VPC。
- select至less2个子网。
- 并select一个安全组。
我花了一天,直到我发现这个修复,希望它可以帮助别人。