什么可能导致"连接ETIMEDOUT" URL在浏览器中工作时出错?

时间:2015-10-26 16:17:42

标签: node.js http

我用NodeJS训练myslef并尝试了一个简单的GET调用。 这是我的代码:

var http = require('http');

var options = {
    host: 'www.boardgamegeek.com',
    path: '/xmlapi/boardgame/1?stats=1',
    method: 'GET'
}

var request = http.request(options, function (response) {
    var str = ""
    response.on('data', function (data) {
        str += data;
    });
    response.on('end', function () {
        console.log(str);
    });
});

request.on('error', function (e) {
    console.log('Problem with request: ' + e.message);
});

request.end();

调用的网址似乎可以在我的浏览器https://www.boardgamegeek.com/xmlapi/boardgame/1?stats=1

中使用

无论如何,我在运行代码时遇到请求问题:连接ETIMEDOUT ,我不知道如何修复它。

什么可能导致此错误?这是我的代码还是网络/代理问题?

6 个答案:

答案 0 :(得分:6)

当在代理后面时,您需要进行以下修改(如this answer中所述):

  • 将代理主机放入host参数
  • 将代理端口放在port参数
  • 将完整的目标网址放在path参数中:

给出了:

var options = {
    host: '<PROXY_HOST>',
    port: '<PROXY_PORT>',
    path: 'http://www.boardgamegeek.com/xmlapi/boardgame/1?stats=1',
    method: 'GET',
    headers: {
        Host: 'www.boardgamegeek.com'
    }
}

答案 1 :(得分:0)

我在Ubuntu服务器上遇到此问题,同时在PM2上维护了一个节点实例。基本上,在执行拉动后重新启动实例后,我在代码内的mySQL初始连接上遇到了相同的错误。

Error: connect ETIMEDOUT
at Connection._handleConnectTimeout (/home/deam_server/node_modules/mysql/lib/Connection.js:419:13)
at Object.onceWrapper (events.js:275:13)
at Socket.emit (events.js:182:13)
at Socket.EventEmitter.emit (domain.js:442:20)
at Socket._onTimeout (net.js:447:8)
at ontimeout (timers.js:427:11)
at tryOnTimeout (timers.js:289:5)
at listOnTimeout (timers.js:252:5)
at Timer.processTimers (timers.js:212:10)

尽管相同的代码在我的本地计算机上运行良好。 之后,我使用了“ df”命令,该命令帮助我意识到我的根目录已被100%占用。我为根目录分配了一些内存,然后重新启动了节点实例,然后它开始正常工作。

答案 2 :(得分:0)

对请求的以下更改对我有用:

 var options = {
         proxy:'PROXY URL', 
         uri: 'API URL',
         method: 'GET' 
         }
 request(options, function (err, response, body) {
     if(err){
        console.log('error:', err);
       } else {
     console.log('body:', body);
      }
   });

答案 3 :(得分:0)

就我而言,这是一个配置错误的子网。 ELB中的两个子网中只有一个起作用。但是我的客户端一直试图连接到配置错误的客户端。

答案 4 :(得分:0)

如果您有URL 就像:

  URL: 'localhost:3030/integration', 

上面的URL引起了一些问题,因为URL的开头不存在HTTP,因此只需对其进行更改即可。

URL: 'http://localhost:3030/integration', 
  

答案 5 :(得分:0)

在我的情况下,这是因为http,而不是https所必需的