Node.js nodejs httprequest带有数据-获取错误getaddrinfo Enoint 更新-自行回答

Node.js nodejs httprequest带有数据-获取错误getaddrinfo Enoint 更新-自行回答,node.js,httprequest,getaddrinfo,Node.js,Httprequest,Getaddrinfo,我看到一个人必须确保DNS从机器上正确解析,检查以确保该域是可解析的 原始问题 我正在编写一个基于节点的程序,在这个程序中,用户可以要求我代表他们做一个httprequest{当然,他们向我提供了一些数据和调用的方法},但每次我做httprequest时,它都会给我一个错误 getaddrinfo eNONT 这就是我的代码的外观 function makehttprequest(deviceid, httpaction, httppath,methods, actiondata, callba

我看到一个人必须确保DNS从机器上正确解析,检查以确保该域是可解析的

原始问题 我正在编写一个基于节点的程序,在这个程序中,用户可以要求我代表他们做一个httprequest{当然,他们向我提供了一些数据和调用的方法},但每次我做httprequest时,它都会给我一个错误

getaddrinfo eNONT 这就是我的代码的外观

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”这样的域名,而不是“www.google.com/hello world”或“www.google.com/hello world”

只保留域名


这里有一个例子:

我得到了[Error:Getaddrinfo enoint],但就在得到[Error:connectemfile]之后;由于我对数千个客户端进行负载测试,EMFILE错误(根本原因)被掩盖了。解决方案是:增加文件描述符的数量。在这里添加它是为了完整性,以防其他人也有同样的问题。

我在调用
server.listen(端口、主机)时遇到这个错误其中主机无法解析回本地计算机

一旦我将其改回本地计算机解析的主机名/域名/ip,这个错误就消失了


由于我试图通过主机名进行开发连接,因此我在我的主机文件中添加了一个具有所需主机名的条目,并确保该条目与传递给
server.listen()的主机名相匹配。如果您有一个尾随斜杠,则问题也会发生:

好:
“www.google.com”


坏:
“www.google.com/”
我今天又犯了一个愚蠢的错误。这是因为端口号是主机名的一部分

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

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

通过使用
request
模块而不是
http


如果您的所有代码看起来都正常,但仍然出现相同的错误,这就是我的情况,那么解决方案是在我的
/etc/resolv.conf
文件中检查名称服务器

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

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


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

我也有类似问题,但作为AWS Lambda函数运行,如果有人对Lambda函数有问题,我就是这样解决的

  • 给你的Lambda函数一个VPC
  • 至少选择2个子网
  • 并选择一个安全组

我花了一天的时间才找到这个补丁,希望它能帮助其他人。

+1表示“www.google.com”,类似于主机名而不是“”。这解决了我的问题。你是一个了不起的家伙!如果你需要https,你启动服务器的方式会稍有不同。工作起来很有魅力:-)。非常好的捕获。如果您要从请求头中提取主机名(对于代理来说很常见),只需请求.headers['host'].split(':')[0]即可摆脱用于本地开发的端口,请使用127.0.0.1而不是localhost