当 URL 在浏览器中工作时,啥可能导致“连接 ETIMEDOUT”错误?

Posted

技术标签:

【中文标题】当 URL 在浏览器中工作时,啥可能导致“连接 ETIMEDOUT”错误?【英文标题】:What could cause "connect ETIMEDOUT" error when the URL is working in browser?当 URL 在浏览器中工作时,什么可能导致“连接 ETIMEDOUT”错误? 【发布时间】:2016-01-25 20:08:08 【问题描述】:

我用 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();

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

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

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

【问题讨论】:

你在代理后面吗? 是的,我有一个公司代理! 【参考方案1】:

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

将代理主机放入host参数中 将代理端口放入port参数中 将完整的目标 URL 放入 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'
    

【讨论】:

谢谢!有用。我必须在路径中添加 http 和主机头,但它不能通过代理工作。 我的代理上有用户名和密码,我该如何实现? 如果代码来自 3pp 并且我们无法修改它怎么办?如何绕过代理?【参考方案2】:

在 PM2 上维护节点实例时,我在 Ubuntu Server 上遇到了这个问题。基本上在拉取后重新启动实例后,我在代码中初始连接 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% 占用。我为根目录分配了一些内存并重新启动了节点实例,然后它开始正常工作。

【讨论】:

【参考方案3】:

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

 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);
      
   );

【讨论】:

【参考方案4】:

就我而言,这是一个配置错误的子网。 ELB 中的 2 个子网中只有一个有效。但是我的客户一直试图连接到配置错误的那个。

【讨论】:

【参考方案5】:

如果你有网址 喜欢:

  URL: 'localhost:3030/integration', 

上面的 URL 会导致一些问题,因为 URL 的开头不存在 HTTP,所以只需将其更改为它应该可以工作。

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

【讨论】:

【参考方案6】:

就我而言,这是因为http 而不是https 所要求的

【讨论】:

以上是关于当 URL 在浏览器中工作时,啥可能导致“连接 ETIMEDOUT”错误?的主要内容,如果未能解决你的问题,请参考以下文章

在 JS 中工作时,在 Typescript 项目中添加本地依赖项不起作用

在代理 testng 中工作时返回连接超时

如何在 UI 线程中工作时更新进度条

在 MVC 结构中工作时,DAO 是不是与 Model 相同? [复制]

谷歌地理编码 api 在 Apache Cordova 中的 Ripple 系统中工作时无法在 Android 手机中工作

iPhone 在 Xcode 中工作时不断断开连接