nodejs httprequest with data - get error getaddrinfo ENOENT

时间:2012-03-06 08:31:40

标签: node.js httprequest getaddrinfo

更新 - 自我回答

我看到必须确保从计算机上正确解析DNS,请查看the node documentation以确保该域可解析。

原始问题

我正在编写一个基于节点的程序,其中用户可以让我代表他们进行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…');
}

8 个答案:

答案 0 :(得分:76)

我已经看到这种情况发生在你的主机(你作为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 :(得分:8)

如果您有一个尾部斜杠,也会出现问题:

好: "www.google.com"

错误: "www.google.com/"

答案 2 :(得分:4)

使用request模块而非http

避免所有这些主机名/协议/端口/斜杠问题

https://github.com/mikeal/request

答案 3 :(得分:3)

我得到了[错误:Getaddrinfo ENOENT],但是在获得[错误:连接EMFILE]之后它是正确的;因为我正在与成千上万的客户端进行负载测试,所以EMFILE错误(根本原因)被忽略了。解决方案是the same as for EMFILE:增加文件描述符的数量。只需将其添加到此处即可获得完整性,以防其他人遇到同样的问题。

答案 4 :(得分:3)

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

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

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

答案 5 :(得分:2)

我在调用server.listen(PORT, HOST);时收到此错误,其中HOST无法解析回本地计算机。

一旦我将其更改回本地计算机解析的主机名/域名/ IP,此错误就消失了。

由于我尝试通过主机名连接以进行开发目的,因此我在主机文件中添加了一个带有所需主机名的条目,并确保这与传递给server.listen()的主机名匹配

答案 6 :(得分:0)

如果您的所有代码似乎都没有问题,并且您仍然遇到相同的错误(我的情况就是这样),那么解决方法就是检查/etc/resolv.conf文件上的名称服务器。

我在resolv.conf文件的开头添加了Google的名称服务器(8.8.8.8),代码再次开始正常运行,不再出错。

值得注意的是,在我运行sudo apt-get upgrade之后,2015年2月4日我发生了这个错误,我的节点js必须已经更新并且引入了一个似乎与之不兼容的错误我有名字服务员。

首先,我通过在命令行上使用wget获取所需的URL来检查我是否遇到任何DNS问题,我得到了目标网址的内容,所以我认为它不是实际上是DNS问题,但确实如此。

答案 7 :(得分:0)

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

  • 为您的Lambda函数提供VPC。
  • 选择至少2个子网。
  • 并选择一个安全组。

我花了一天时间才发现这个问题,希望它可以帮助别人。