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