Error: ESOCKETTIMEDOUT but doesn't seem to be DNS like other SO posts suggest

Error: ESOCKETTIMEDOUT but doesn't seem to be DNS like other SO posts suggest

我在使用 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 导致了这个问题,我使用 test/resolve:

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

这对上面请求的结果没有任何改变。

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

编辑**

我的 DNS 在我的开发机器上完全正常,所以那里的问题为零。另外,当我 request({'http://${monitor.body.url}', function (error, response, body) { 时我没有遇到这个问题,所以我使用请求

的方式似乎是错误的

解决了问题。我的编辑给出了它可能是什么的想法......所以我与 Request 一起使用的超时实际上以毫秒为单位,而不是我认为的秒数。所以它在 20 毫秒后超时,导致错误甚至 DNS 都没有正确完成。我将其更改为实际 20 秒,问题似乎已解决。