错误:ESOCKETTIMEDOUT但似乎不像其他SO帖子建议的DNS

问题描述 投票:0回答:1

我在npm request包中遇到一些问题,并让它正确调用任何URL,除非URL是关闭的服务器。例如,我不能调用amazon.com但我可以调用dev.personalDomain.com,它指向一个完全关闭的EC2实例。

我试图去除应用程序逻辑,以便只产生错误。

对于此示例,假设monitor.body.url = 'amazon.com'是一个字符串

我的代码

request({url: `http://${monitor.body.url}`, timeout: 20}, function (error, response, body) {
    console.log(`Response: ${response}`);
    console.log(`Body: ${body}`);
    console.log(`Error: ${error}`);
    if(error == 'ENOTFOUND' || error == 'ETIMEDOUT') {
      response.statusCode = 500;
  }
  if(error || response.statusCode < 200 && response.statusCode > 299 || !response.statusCode) {
    if(!response || !response.statusCode)  response.statusCode = 500;

    // Application logic

  }
  // If nothing went wrong just console.log -- This is used for debugging not useful in prod
  if(!error || response.statusCode > 299 || response.statusCode < 200)console.log(`Successfully called ${monitor.body.url}`);

});

错误信息

Response: undefined
Body: undefined
Error: Error: ESOCKETTIMEDOUT
/home/ec2-user/environment/service/app.js:91
          if(!response || !response.statusCode)  response.statusCode = 500;
                                                                     ^

TypeError: Cannot set property 'statusCode' of undefined

我去google / SO看了一下,发现它可能是导致问题的DNS并测试/解决我使用的问题:

const dns = require("dns");
dns.setServers(['8.8.8.8', '1.1.1.1']);

这没有改变上述请求的结果。

有没有人对这可能有什么建议或想法?我没有运气找到一个接近的例子并产生相同的错误信息。

编辑**

我的开发机器上的DNS非常好,因此零问题。当我只有request({'http://${monitor.body.url}', function (error, response, body) {时,我没有这个问题,所以看起来像我使用请求的错误

node.js http-error npm-request
1个回答
1
投票

找出问题所在。我的编辑给出了它可能是什么...然后我使用Request的超时实际上是毫秒而不是像我想象的那样。因此,它在20毫秒后超时,导致错误,即使DNS没有正确完成。我把它改为实际上是20秒,问题似乎已经解决了。

© www.soinside.com 2019 - 2024. All rights reserved.