2012-03-06 121 views
33

更新 - 通过自我回复 我看到一个人必须确保从计算机上正确解析DNS,检查此代码以确保url可到达nodejs.org/文档/最新/ API/dns.html#dns.resolvenodejs httprequest与数据 - 获取错误getaddrinfo ENOENT

原始的问题

我写的基于程序的节点,其中,用户可以要求我做一个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…'); 
} 
+1

对于本地开发,请使用127.0.0.1而不是本地主机 – 2016-06-23 06:00:04

回答

74

我已经看到这种情况发生时,你的主机(你在通过为httpaction)具有方案(这样的“http://”)在前面的。您的主机应该严格像“www.google.com”而不是“http://www.google.com”或“www.google.com/hello-world”或“http://www.google.com/hello-world”的域。

保持它只是域。

下面是一个例子:http://allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html

+1

对于“www.google.com”,而不是“http://www.google.com”。这解决了我的问题。 – Eye 2012-06-28 05:05:24

+0

你是一个了不起的人!不会想到这一点。 – Slavo 2012-10-25 20:12:37

+0

如果u需要https://开头?如果您跳过它,默认将变为http:// – 2013-01-03 03:43:26

3

我得到[错误:的getaddrinfo ENOENT],但它是越来越之后[错误:连接EMFILE]。因为我正在用数千个客户端进行负载测试,所以EMFILE错误(根本原因)是不透明的。解决方案是the same as for EMFILE:增加文件描述符的数量。只要在这里添加它,以防其他人有相同的问题。

2

调用server.listen(PORT, HOST);其中HOST无法解析回本地机器,当我得到这个错误。

有一次,我改变了这一回主机名/域名/ IP本地机器决心,这个错误就走开了。

因为我是想通过用于开发目的,我增加了一个入口到我的主机与所需的主机文件,并确保这种匹配传递给server.listen()

8

问题的主机名,如果您有也有可能发生一个主机连接一个斜线:

好:"www.google.com"

坏:"www.google.com/"

3

我今天再次打这个了愚蠢的错误。这是因为端口号被作为主机名的一部分。

// wrong. gets error getaddrinfo ENOENT 
var options = { 
    hostName: 'localhost:1337', 
    .... 
} 

// correct 
var options = { 
    hostname: 'localhost', 
    port: 1337, 
}; 
+0

如果你从请求标头(通用代理)拉取主机名,只需要request.headers ['host']。split(':')[0]去掉端口 – netpoetica 2014-07-10 02:06:16

0

这些主机名/协议/端口/斜线问题,如果你所有的代码似乎是好的,但是仍得到同样的错误,这是我的情况下,将溶液检查我的/etc/resolv.conf文件的域名服务器。

我在resolv.conf文件(8.8.8.8)的开头添加了Google的名称服务器,代码再次正常工作,没有更多的错误。

这是值得注意的是,开始发生在我身上的2015年2月4日这个错误我跑了sudo apt-get upgrade后,我的节点JS必须已更新,并引入了错误,这似乎是与域名服务器,我有不兼容的。

起初我检查我是否有通过获取我需要使用命令行上wget的URL的任何DNS问题,我得到了目标URL的内容细,所以我不认为它实际上是一个DNS的问题,但它是。

0

我有一个类似的问题,但作为AWS Lambda函数运行,所以如果有人遇到了Lambda函数的这个问题,这是我如何解决它。

  • 给你的拉姆达功能的VPC。
  • 至少选择2个子网。
  • 并选择一个安全组。

我花了一天,直到我找到了这个修复程序,希望它可以帮助别人。