Node.js getaddrinfo ENOTFOUND


265

Використовуючи 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.

Дякуємо за прочитане



довелося використовувати var http = require("http");або var https = require("https");базуватися на віддаленому хості
— prayagupd

що ENOTFOUND означає?
— Чарлі Паркер

Відповіді:


280

У документації модуля 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.


16
Дякую за швидку відповідь, це прекрасно працює! Мені здається, що я спростовую власне питання, щоб спершу не прочитати документи.
— Vineet Kosaraju

2
Моя проблема полягала в тому, що в сценарії nodejs я робив запит на неправильну URL-адресу, і ця помилка була викинута.
— Майкл Дж. Калкінс

49
Таким чином , в основному, щоб підвести підсумок: 1. включати тільки фактичне ім'я хоста в host, так немає http://або https://; і 2. Не включайте шлях у hostвласність, а скоріше у pathвласність.
— Едуард Лука

1
Мій зразок коду в навчальному вузлі мені цього не пояснив. Тепер я розумію, чому у мене були дивні невдачі, коли я заповнив options {...}блок.
— Майкл Шопсін

+ переконайтеся, що порт також знаходиться в окремому атрибуті параметра від хоста.
— Лукаш Лукач

240

Ще одне поширене джерело помилок для

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'
  }; 

7
Це більш загальна помилка, ніж обговорювана.
— shaunakde

5
Дякую, що опублікував це альтернативне рішення, я саме наткнувся на це.
— Райан

Дякую @Jorge, я використовую http.request (), який видалив помилку, я збирався використовувати http.get (), але я просто видалив http: // з http.request () і працював.
— Шашікант Пандіт

17

в опціях для HTTP-запиту переключіть його на

var options = { host: 'eternagame.wikia.com', 
                path: '/wiki/EteRNA_Dictionary' };

Я думаю, це вирішить вашу проблему.


1
Дякую за відповідь! Це також працює чудово, але я позначив інший як правильний, оскільки він має посилання на документи та два варіанти.
— Vineet Kosaraju

12
  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);
        });

  });

Дякую за відповідь! Так само, як і відповідь Рассбера, ця працює чудово, але я відзначив правильність юксуана, оскільки він дав і варіанти, і посилання на документи.
— Vineet Kosaraju

1
Просто введіть код, не пояснюючи, що проблема та яке рішення насправді не є повною відповіддю, я не бачу, що ви зробили у своєму блоці коду, дякую.
— Аль-Мотафар

11

Якщо вам потрібно використовувати https, то використовуйте бібліотеку https

https = require('https');

// options
var options = {
    host: 'eternagame.wikia.com',
    path: '/wiki/EteRNA_Dictionary'
}

// get
https.get(options, callback);


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();

важливою частиною цієї відповіді є протокол. nodejs HTTP не підтримує повний URI з host: https://server.com, яка згадується тут, а stackoverflow.com/a/28385129/432903
— prayagupd

3

Зауважте, що ця проблема також може виникнути, якщо домен, на який ви посилаєтесь, знизиться (EG більше не існує.)


3

Я виправив цю помилку за допомогою цього

$ 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/isissue/6686


2

Я отримував ту саму помилку і використовував нижче посилання, щоб отримати допомогу:

https://nodejs.org/api/http.html#http_http_request_options_callback

Я не мав у своєму коді:

req.end();

(NodeJs V: 5.4.0) після додавання вище req.end();рядка, я зміг позбутися помилки і добре працював для мене.


1

Я спробував це за допомогою модуля запиту , і міг легко надрукувати тіло цієї сторінки. На жаль, маючи навички, які я маю, я не можу допомогти іншим.


Дякую за посилання на модуль, але я сподівався зробити це зі стандартною бібліотекою node.js, використовуючи http.get ().
— Vineet Kosaraju

0

Я отримав цю помилку, переходячи від середовища розробки до виробничого середовища. Я був одержимий розміщенням https://усіх посилань. Це не обов'язково, тому для деяких це може бути рішенням.


0

Я позбувся http та додаткової косої риски (/). Я просто використав цей "node-test.herokuapp.com", і він спрацював.


0

Якщо ви все ще стикаєтеся з налаштуванням проксі-сервера, для мене саме проксі-налаштування відсутнє, і він не зміг зробити запит, оскільки прямі 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
};

0

Цю проблему я вирішив, видаливши непотрібні символи з пароля для з'єднання. Наприклад, у мене були такі символи: <##%, і це спричинило проблему (швидше за все, хеш-тег був першопричиною проблеми).


0

Спробуйте використовувати IP-адресу сервера, а не ім'я хоста. Це працювало для мене. Сподіваємось, це теж спрацює і для вас.


0

Моя проблема полягала в тому, що ми розбирали 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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.