Node.js getaddrinfo ENOTFOUND


265

Podczas korzystania z Node.js w celu uzyskania zawartości HTML poniższej strony internetowej:

eternagame.wikia.com/wiki/EteRNA_Dictionary

Otrzymuję następujący błąd:

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)

Już sprawdziłem ten błąd podczas stackoverflow i zdałem sobie sprawę, że dzieje się tak, ponieważ node.js nie może znaleźć serwera z DNS (tak myślę). Nie jestem jednak pewien, dlaczego tak jest, ponieważ mój kod działa doskonale www.google.com.

Oto mój kod (praktycznie skopiowany i wklejony z bardzo podobnego pytania, z wyjątkiem zmiany hosta):

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

Oto źródło, z którego skopiowałem i wkleiłem : Jak wykonywać połączenia z serwisem internetowym w Expressjs?

Nie używam żadnych modułów z node.js.

Dziękuje za przeczytanie.



musiał użyć var http = require("http");lub var https = require("https");opierać się na zdalnym hoście
prayagupd

co ENOTFOUND znaczy
Charlie Parker,

Odpowiedzi:


280

W dokumentacji modułu Node.js HTTP : http://nodejs.org/api/http.html#http_http_request_options_callback

Możesz albo zadzwonić http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback), adres URL jest następnie analizowany url.parse(); lub zadzwoń http.get(options, callback), gdzie optionsjest

{
  host: 'eternagame.wikia.com',
  port: 8080,
  path: '/wiki/EteRNA_Dictionary'
}

Aktualizacja

Jak stwierdzono w komentarzu @EnchanterIO, portpole jest również osobną opcją; i protokół http://nie powinien być zawarty w hostterenie. Inne odpowiedzi również zalecają użycie httpsmodułu, jeśli wymagany jest protokół SSL.


16
Dzięki za szybką odpowiedź, to działa idealnie! Mam ochotę oddać moje własne pytanie za to, że nie przeczytałem najpierw dokumentów.
Vineet Kosaraju,

2
Mój problem polegał na tym, że w skrypcie nodejs wysyłałem żądanie do niewłaściwego adresu URL i ten błąd został zgłoszony.
Michael J. Calkins,

49
Podsumowując: 1. Podaj tylko rzeczywistą nazwę hosta host, więc nie http://lub https://; oraz 2. Nie dołączaj ścieżki do hostwłaściwości, ale raczej do pathwłaściwości.
Eduard Luca,

1
Mój przykładowy kod w Learning Node nie wyjaśnił mi tego. Teraz rozumiem, dlaczego mam dziwne niepowodzenia, kiedy wypełniłem options {...}blok.
Michael Shopsin

+ upewnij się, że port jest również w osobnym atrybucie opcji od hosta.
Lukas Lukac

240

Kolejnym częstym źródłem błędu dla

Error: getaddrinfo ENOTFOUND
    at errnoException (dns.js:37:11)
    at Object.onanswer [as oncomplete] (dns.js:124:16)

pisze protokół (https, https, ...) podczas ustawiania hostwłaściwości woptions

  // DON'T WRITE THE `http://`
  var options = { 
    host: 'http://yoururl.com',
    path: '/path/to/resource'
  }; 

7
Jest to błąd bardziej ogólny niż omawiany.
shaunakde

5
Dziękuję za opublikowanie tego alternatywnego rozwiązania, dokładnie na to wpadłem.
Ryan,

Dzięki @Jorge używam http.request (), który zgłosił błąd tak samo, miałem zamiar użyć http.get (), ale właśnie usunąłem http: // z http.request () i działałem.
Shashikant Pandit

17

w opcjach żądania HTTP zmień je na

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

Myślę, że to rozwiąże twój problem.


1
Dziękuję za odpowiedź! To również działa idealnie, ale zaznaczyłem drugą jako poprawną, ponieważ ma link do dokumentów i dwie opcje.
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);
        });

  });

Dziękuję za odpowiedź! Podobnie jak odpowiedź Russbeara, ta działa doskonale, ale zaznaczyłem poprawność yuxhuanga, ponieważ podał obie opcje i link do dokumentów.
Vineet Kosaraju,

1
Po prostu kod bez wyjaśnienia, na czym polega problem i jakie rozwiązanie nie jest tak naprawdę kompletną odpowiedzią, nie widzę, co zrobiłeś w swoim bloku kodu, dzięki.
Al-Mothafar,

11

Jeśli potrzebujesz użyć protokołu https, skorzystaj z biblioteki https

https = require('https');

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

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


7

Myślę, że http wysyła żądanie na porcie 80, mimo że wspomniałem pełny adres URL hosta w obiekcie opcji. Kiedy uruchomiłem aplikację serwera, która ma API, na porcie 80, który wcześniej działałem na porcie 3000, działało. Pamiętaj, że aby uruchomić aplikację na porcie 80, potrzebujesz uprawnień administratora.

Error with the request: getaddrinfo EAI_AGAIN localhost:3000:80

Oto pełny fragment kodu

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

ważną częścią tej odpowiedzi jest protokół. nodejs http nie obsługiwał pełnego URI host: https://server.com, o którym jest tutaj wspomniane, a także stackoverflow.com/a/28385129/432903
prayagupd

3

Pamiętaj, że ten problem może również wystąpić, jeśli wskazana domena ulegnie awarii (np. Już nie istnieje).


3

Naprawiłem ten błąd

$ 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!

Oryginalne źródło: https://github.com/npm/npm/issues/6686



1

Wypróbowałem to za pomocą modułu żądania i byłem w stanie dość łatwo wydrukować treść tej strony. Niestety przy moich umiejętnościach nie mogę pomóc innym niż to.


Dzięki za link do modułu, ale miałem nadzieję zrobić to ze standardową biblioteką node.js, używając http.get ().
Vineet Kosaraju,

0

Wystąpił ten błąd podczas przechodzenia ze środowiska programistycznego do środowiska produkcyjnego. Miałem obsesję na punkcie umieszczania https://wszystkich linków. Nie jest to konieczne, więc może być rozwiązaniem dla niektórych.


0

Pozbyłem się http i dodatkowego slash (/). Właśnie użyłem tego „node-test.herokuapp.com” i zadziałało.


0

Jeśli nadal czeka Cię sprawdzenie ustawień proxy, dla mnie brakowało ustawienia proxy i nie było w stanie wykonać żądania, ponieważ bezpośrednie http / https są zablokowane. Skonfigurowałem więc proxy z mojej organizacji podczas wysyłania żądania.

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

Ten problem został rozwiązany przez usunięcie niechcianych znaków z hasła połączenia. Na przykład miałem te znaki: <##% i to spowodowało problem (najprawdopodobniej główną przyczyną problemu była hash).


0

Spróbuj użyć adresu IP serwera zamiast nazwy hosta. To zadziałało dla mnie. Mam nadzieję, że to również zadziała dla ciebie.


0

Mój problem polegał na tym, że analizowaliśmy adres URL i generowaliśmy http_options dla http.request ();

Używałem request_url.host, który miał już numer portu z nazwą domeny, więc musiałem użyć 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;
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.