36

更新 - 自己回答

我看到必须确保从机器正确解析 DNS,查看节点文档以确保域是可解析的。

原始问题

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

8 回答 8

77

我已经看到当您的主机(您作为 httpaction 传入)在其前面有方案(因此“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

于 2012-03-20T03:14:48.757 回答
8

如果您有一个斜杠,也可能会发生问题:

好的: "www.google.com"

坏的: "www.google.com/"

于 2012-11-02T02:28:27.350 回答
4

request通过使用模块而不是避免所有这些主机名/协议/端口/斜杠问题http

https://github.com/mikeal/request

于 2013-08-14T00:19:39.987 回答
3

我得到 [Error: Getaddrinfo ENOENT],但在得到 [Error: connect EMFILE]; 因为我正在对数千个客户端进行负载测试,所以 EMFILE 错误(根本原因)是不透明的。解决方案与 EMFILE 相同:增加文件描述符的数量。只是为了完整起见将其添加到此处,以防其他人遇到同样的问题。

于 2012-09-13T14:34:13.927 回答
3

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

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

// correct
var options = {
    hostname: 'localhost',
    port: 1337,
};
于 2013-05-08T04:45:58.130 回答
2

调用server.listen(PORT, HOST);无法将 HOST 解析回本地计算机时出现此错误。

一旦我把它改回本地机器解析的主机名/域名/IP,这个错误就消失了。

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

于 2012-10-30T03:21:49.597 回答
0

如果您的所有代码似乎都正常并且您仍然遇到相同的错误,这就是我的情况,则解决方案是检查我/etc/resolv.conf文件中的名称服务器。

我在resolv.conf文件(8.8.8.8)的开头添加了谷歌的名称服务器,代码再次开始正常工作,不再出现错误。

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

起初,我通过wget在命令行上获取所需的 URL 来检查是否有任何 DNS 问题,我得到了目标 url 的内容,所以我不认为这实际上是 DNS 问题,但确实如此。

于 2015-02-04T22:33:03.193 回答
0

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

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

我花了一天时间才找到此修复程序,希望对其他人有所帮助。

于 2017-02-01T00:53:01.967 回答