Ошибка: ESOCKETTIMEDOUT, но, похоже, это не DNS, как предполагают другие сообщения SO

У меня возникли некоторые проблемы с пакетом 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) {, поэтому похоже на ошибку в том, как я использую запрос


person joshk132    schedule 10.03.2019    source источник
comment
Я не уверен, что setServers влияет на что-либо, кроме вызовов, напрямую использующих библиотеку DNS. Большая часть кода Node будет использовать преобразователь по умолчанию независимо от его настроек. Есть ли проблемы с эквивалентной выборкой с помощью другого инструмента, такого как команда curl?   -  person tadman    schedule 10.03.2019
comment
@tadman Хотите объяснить, что вы имеете в виду? Как мне тогда настроить DNS-серверы для request? Я нашел мало упоминаний о настройках DNS на странице запроса npm.   -  person joshk132    schedule 10.03.2019
comment
Я не уверен, использует ли библиотека request средство DNS Node.js или просто опирается на значение по умолчанию (например, gethostbyname или эквивалент в LibUV), поэтому я предлагаю вам сначала убедиться, что вы можете разрешить это имя хоста в чем-то другом, кроме Node.   -  person tadman    schedule 10.03.2019
comment
› Я предлагаю вам сначала убедиться, что вы можете разрешить это имя хоста во что-то кроме Node. У меня нет проблем с переходом на amazon.com, если это то, что вы предлагаете. Как упоминалось в ОП, предположим, что URL-адрес, который я пытаюсь найти, amazon.com, поэтому, исходя из этого, я могу перейти на amazon.com, а также могу использовать curl, чтобы добраться до него. Я собираюсь сказать, что я в безопасности и могу решить проблему Внешний узел DNS.   -  person joshk132    schedule 10.03.2019
comment
Основываясь на некоторых тестах, похоже, что request действительно все равно, на что настроены ваши setServers. Вам нужно будет запустить DNS вашего компьютера или выполнить разрешение и сделать запрос на фиксированный IP-адрес вместо этого без участия DNS.   -  person tadman    schedule 10.03.2019
comment
Попробуйте example.com или stackoverflow.com, чтобы увидеть, загружаются ли они вообще или нет. Сузьте проблему, возможно, это Amazon или, возможно, мой брандмауэр локального приложения.   -  person tadman    schedule 10.03.2019
comment
@tadman Неважно, какой URL-адрес, он вообще не будет работать, кроме того, как я изложил в ОП. Если я установлю его на dev.personalDomain.com, который указывает на экземпляр EC2, который выключен/остановлен, тогда он работает, но для всех других доменов он не работает.   -  person joshk132    schedule 10.03.2019
comment
@tadman Также готов мой OP редактировать   -  person joshk132    schedule 10.03.2019
comment
Вы получаете сообщения об ошибках от request? Если так, то кто они? Обратите внимание, что использование подхода, основанного на промисах, через then или await заставляет вас обращать внимание на ошибки.   -  person tadman    schedule 10.03.2019
comment
@tadman Проверьте мой OP, он там из исходного поста. Проверьте часть, которая говорит о сообщении об ошибке.   -  person joshk132    schedule 10.03.2019
comment
Я поместил 3 файла console.log в свой код, чтобы показать результаты. В моем разделе ошибок я включаю вывод этих console.logs   -  person joshk132    schedule 10.03.2019
comment
А, теперь я это вижу. Что он делает с example.com?   -  person tadman    schedule 10.03.2019
comment
@tadman То же самое, что и с amazon.com. Я проверил еще раз после вашего первоначального запроса и точно такой же результат, который я получил ранее, когда тестировал его.   -  person joshk132    schedule 10.03.2019
comment
@tadman Я на 99% уверен, что это никоим образом не DNS, если только это не DNS внутри Node.js/моего приложения.   -  person joshk132    schedule 10.03.2019
comment
@tadman Спасибо за вашу помощь и проверьте мой ответ на актуальную проблему.   -  person joshk132    schedule 10.03.2019


Ответы (1)


Разобрался с вопросом. Мое редактирование дает представление о том, что это может быть... Таким образом, тайм-аут, который я использую с запросом, на самом деле составляет миллисекунды, а не секунды, как я думал. Таким образом, время ожидания истекло через 20 миллисекунд, что привело к ошибке, из-за которой даже DNS не работал должным образом. Я изменил его на 20 секунд, и проблема кажется решенной.

person joshk132    schedule 10.03.2019