Node.js getaddrinfo ENOTFOUND
При использовании Node.js, чтобы попытаться получить html-содержимое следующей веб-страницы:
eternagame.wikia.com/wiki/EteRNA_Dictionary
Я получаю следующую ошибку:
events.js:72
throw er; // Unhandled 'error' event
^
Error: getaddrinfo ENOTFOUND
at errnoException (dns.js:37:11)
at Object.onanswer [as oncomplete] (dns.js:124:16)
Я уже искал эту ошибку в stackoverflow и понял, что это потому, что node.js не может найти сервер из DNS (я думаю). Однако я не уверен, почему это так, поскольку мой код отлично работает на www.google.com
.
Вот мой код (практически скопированный и вставленный из очень похожего вопроса, за исключением того, что изменился хост):
var http = require("http");
var options = {
host: 'eternagame.wikia.com/wiki/EteRNA_Dictionary'
};
http.get(options, function (http_res) {
// initialize the container for our data
var data = "";
// this event fires many times, each time collecting another piece of the response
http_res.on("data", function (chunk) {
// append this chunk to our growing 'data' var
data += chunk;
});
// this event fires *one* time, after all the 'data' events/chunks have been gathered
http_res.on("end", function () {
// you can use res.send instead of console.log to output via express
console.log(data);
});
});
Вот источник, откуда я скопировал и вставил: Как выполнять вызовы веб-служб в Expressjs?
Я не использую никаких модулей с node.js.
Спасибо за чтение.
Ответы
Ответ 1
В документации модуля Node.js HTTP
: http://nodejs.org/api/http.html#http_http_request_options_callback
Вы можете позвонить http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback)
, затем URL анализируется с url.parse()
; или позвоните в http.get(options, callback)
, где options
равно
{
host: 'eternagame.wikia.com',
port: 8080,
path: '/wiki/EteRNA_Dictionary'
}
Обновление
Как указано в комментарии @EnchanterIO, поле port
также является отдельной опцией; и протокол http://
не должен быть включен в поле host
. В других ответах также рекомендуется использовать модуль https
, если требуется SSL.
Ответ 2
Другой распространенный источник ошибок для
Error: getaddrinfo ENOTFOUND
at errnoException (dns.js:37:11)
at Object.onanswer [as oncomplete] (dns.js:124:16)
записывает протокол (https, https,...) при настройке свойства host
в options
// DON'T WRITE THE `http://`
var options = {
host: 'http://yoururl.com',
path: '/path/to/resource'
};
Ответ 3
в параметрах HTTP-запроса, переключите его на
var options = { host: 'eternagame.wikia.com',
path: '/wiki/EteRNA_Dictionary' };
Я думаю, что это исправит вашу проблему.
Ответ 4
var http=require('http');
http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', function(res){
var str = '';
console.log('Response is '+res.statusCode);
res.on('data', function (chunk) {
str += chunk;
});
res.on('end', function () {
console.log(str);
});
});
Ответ 5
Если вам нужно использовать https, используйте библиотеку https
https = require('https');
// options
var options = {
host: 'eternagame.wikia.com',
path: '/wiki/EteRNA_Dictionary'
}
// get
https.get(options, callback);
Ответ 6
Моя проблема заключалась в том, что DNS-служба OS X (Mavericks) была перезагружена.
Ответ 7
Я думаю, что http делает запрос на порт 80, хотя я упомянул полный URL-адрес хоста в объекте опций. Когда я запускаю серверное приложение, имеющее API, на порту 80, которое я запускал ранее на порту 3000, он работал. Обратите внимание, что для запуска приложения на порту 80 вам понадобятся права root.
Error with the request: getaddrinfo EAI_AGAIN localhost:3000:80
Вот полный фрагмент кода
var http=require('http');
var options = {
protocol:'http:',
host: 'localhost',
port:3000,
path: '/iso/country/Japan',
method:'GET'
};
var callback = function(response) {
var str = '';
//another chunk of data has been recieved, so append it to `str`
response.on('data', function (chunk) {
str += chunk;
});
//the whole response has been recieved, so we just print it out here
response.on('end', function () {
console.log(str);
});
}
var request=http.request(options, callback);
request.on('error', function(err) {
// handle errors with the request itself
console.error('Error with the request:', err.message);
});
request.end();
Ответ 8
Обратите внимание, что эта проблема также может возникнуть, если домен, на который вы ссылаетесь, падает (EG больше не существует.)
Ответ 9
Я исправил эту ошибку с помощью этого
$ npm info express --verbose
# Error message: npm info retry will retry, error on last attempt: Error: getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443
$ nslookup registry.npmjs.org
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
registry.npmjs.org canonical name = a.sni.fastly.net.
a.sni.fastly.net canonical name = prod.a.sni.global.fastlylb.net.
Name: prod.a.sni.global.fastlylb.net
Address: 151.101.32.162
$ sudo vim /etc/hosts
# Add "151.101.32.162 registry.npmjs.org' to hosts file
$ npm info express --verbose
# Works now!
Первоисточник: https://github.com/npm/npm/issues/6686
Ответ 10
Я получал ту же ошибку и использовал ниже ссылку для получения справки:
https://nodejs.org/api/http.html#http_http_request_options_callback
У меня не было кода:
req.end();
(NodeJs V: 5.4.0)
однажды добавленный выше строки req.end();
, я смог избавиться от ошибки и работал отлично для меня.
Ответ 11
Я попробовал его с помощью модуля запросов и смог легко распечатать тело этой страницы. К сожалению, с теми навыками, которые у меня есть, я не могу помочь кроме этого.
Ответ 12
Я получил эту ошибку при переходе от среды разработки к рабочей среде. Я был одержим помещением https://
для всех ссылок. Это необязательно, поэтому это может быть решением для некоторых.
Ответ 13
Я избавился от http и дополнительной косой черты (/).
Я просто использовал этот node -test.herokuapp.com ', и он сработал.
Ответ 14
Если вы все еще сталкиваетесь с проверкой настроек прокси-сервера, для меня это был параметр прокси-сервера, который отсутствовал, и он не смог сделать запрос, поскольку прямой http/https заблокирован. Поэтому я настроил прокси-сервер из моей организации, выполняя запрос.
npm install https-proxy-agent
or
npm install http-proxy-agent
const httpsProxyAgent = require('https-proxy-agent');
const agent = new httpsProxyAgent("http://yourorganzation.proxy.url:8080");
const options = {
hostname: 'encrypted.google.com',
port: 443,
path: '/',
method: 'GET',
agent: agent
};
Ответ 15
Я решил эту проблему устранить нежелательные символы из пароля для подключения. Например, у меня были следующие символы: < ##%, и это вызвало проблему (скорее всего, хэш-тег был основной причиной проблемы).
Ответ 16
Попробуйте использовать IP-адрес сервера, а не имя хоста.
Это сработало для меня. Надеюсь, это сработает и для вас.
Ответ 17
Моя проблема заключалась в том, что мы анализировали URL и генерировали http_options для http.request();
Я использовал request_url.host, у которого уже был номер порта с именем домена, поэтому пришлось использовать request_url.hostname.
var request_url = new URL('http://example.org:4444/path');
var http_options = {};
http_options['hostname'] = request_url.hostname;//We were using request_url.host which includes port number
http_options['port'] = request_url.port;
http_options['path'] = request_url.pathname;
http_options['method'] = 'POST';
http_options['timeout'] = 3000;
http_options['rejectUnauthorized'] = false;
Ответ 18
Решение этой ошибки для меня заключалось в установке http с менеджером пакетов node:
npm install http-server -g