NodeJS 当URL在浏览器中工作时,什么会导致“连接ETIMEDOUT”错误?

628mspwn  于 2023-01-04  发布在  Node.js
关注(0)|答案(8)|浏览(215)

我用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*,但我不知道如何修复。
什么可能导致这个错误?是我的代码还是网络/代理问题?

jjhzyzn0

jjhzyzn01#

在使用代理时,您需要进行以下修改(如本答案中所述):

  • 将代理主机放入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'
    }
}
cld4siwp

cld4siwp2#

在我的情况下,这是因为http,而不是https的要求

efzxgjgh

efzxgjgh3#

如果使用POSTMAN时发生此错误。
因此,当您在Postman中调用请求时,API要求您的VPN在您可以成功调用之前启动。您将需要连接或重新连接您的VPN。
在我的例子中,我在一家公司的笔记本电脑上工作,我发现是VPN坏了。

myzjeezk

myzjeezk4#

以下更改对我很有效:

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

lp0sw83n5#

在我的情况下,这是一个错误配置的子网。只有一个子网的2个在ELB工作。但我的客户端一直试图连接到错误配置的一个。

lndjwyie

lndjwyie6#

如果您URL类似于:

URL: 'localhost:3030/integration',

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

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

6tdlim6h7#

在我的例子中,我得到这个错误是因为我的post API的请求主体非常大。

9o685dep

9o685dep8#

我在Ubuntu Server上维护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%占用。我分配了一些内存到根目录,并重新启动节点示例,然后它开始正常工作。

相关问题