У меня возникли некоторые проблемы с пакетом 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) {
, поэтому похоже на ошибку в том, как я использую запрос
setServers
влияет на что-либо, кроме вызовов, напрямую использующих библиотеку DNS. Большая часть кода Node будет использовать преобразователь по умолчанию независимо от его настроек. Есть ли проблемы с эквивалентной выборкой с помощью другого инструмента, такого как командаcurl
? - person tadman   schedule 10.03.2019request
? Я нашел мало упоминаний о настройках DNS на странице запроса npm. - person joshk132   schedule 10.03.2019request
средство DNS Node.js или просто опирается на значение по умолчанию (например,gethostbyname
или эквивалент в LibUV), поэтому я предлагаю вам сначала убедиться, что вы можете разрешить это имя хоста в чем-то другом, кроме Node. - person tadman   schedule 10.03.2019amazon.com
, если это то, что вы предлагаете. Как упоминалось в ОП, предположим, что URL-адрес, который я пытаюсь найти,amazon.com
, поэтому, исходя из этого, я могу перейти на amazon.com, а также могу использовать curl, чтобы добраться до него. Я собираюсь сказать, что я в безопасности и могу решить проблему Внешний узел DNS. - person joshk132   schedule 10.03.2019request
действительно все равно, на что настроены вашиsetServers
. Вам нужно будет запустить DNS вашего компьютера или выполнить разрешение и сделать запрос на фиксированный IP-адрес вместо этого без участия DNS. - person tadman   schedule 10.03.2019example.com
илиstackoverflow.com
, чтобы увидеть, загружаются ли они вообще или нет. Сузьте проблему, возможно, это Amazon или, возможно, мой брандмауэр локального приложения. - person tadman   schedule 10.03.2019dev.personalDomain.com
, который указывает на экземпляр EC2, который выключен/остановлен, тогда он работает, но для всех других доменов он не работает. - person joshk132   schedule 10.03.2019request
? Если так, то кто они? Обратите внимание, что использование подхода, основанного на промисах, черезthen
илиawait
заставляет вас обращать внимание на ошибки. - person tadman   schedule 10.03.2019example.com
? - person tadman   schedule 10.03.2019amazon.com
. Я проверил еще раз после вашего первоначального запроса и точно такой же результат, который я получил ранее, когда тестировал его. - person joshk132   schedule 10.03.2019