【问题标题】:nodejs httprequest with data - getting error getaddrinfo ENOENT带有数据的节点 js http 请求 - 获取错误 getaddrinfo ENOENT
【发布时间】:2012-03-23 17:26:00
【问题描述】:

更新 - 自行回答

我看到必须确保从机器正确解析 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…');
}

【问题讨论】:

  • 对于本地开发使用 127.0.0.1 而不是 localhost

标签: node.js httprequest getaddrinfo


【解决方案1】:

我已经看到当您的主机(您作为 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”,例如主机名,而不是“google.com”。这解决了我的问题。
  • 你是个了不起的人!不会想到这一点。
  • 如果您需要 https,则启动服务器的方式略有不同。
  • 工作就像一个魅力:-)。很棒的收获。
【解决方案2】:

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

好: "www.google.com"

不好: "www.google.com/"

【讨论】:

    【解决方案3】:

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

    https://github.com/mikeal/request

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 如果您从请求标头中提取主机名(代理常见),只需 request.headers['host'].split(':')[0] 摆脱端口
        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:

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

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

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

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

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-06-06
              • 2012-02-21
              • 2020-09-20
              • 1970-01-01
              • 1970-01-01
              • 2013-09-21
              • 2017-08-08
              • 2017-09-12
              相关资源
              最近更新 更多