Node.js getaddrinfo ENOTFOUND


265

Wenn Sie mit Node.js versuchen, den HTML-Inhalt der folgenden Webseite abzurufen:

eternagame.wikia.com/wiki/EteRNA_Dictionary

Ich erhalte folgende Fehlermeldung:

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)

Ich habe diesen Fehler bereits beim Stackoverflow nachgeschlagen und festgestellt, dass dies daran liegt, dass node.js den Server nicht über DNS finden kann (glaube ich). Ich bin mir jedoch nicht sicher, warum dies so ist, da mein Code perfekt funktioniert www.google.com.

Hier ist mein Code (praktisch kopiert und eingefügt von einer sehr ähnlichen Frage, außer wenn der Host geändert wurde):

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

Hier ist die Quelle, aus der ich kopiert und eingefügt habe: Wie mache ich Webdienstaufrufe in Expressjs?

Ich verwende keine Module mit node.js.

Danke fürs Lesen.



musste verwenden var http = require("http");oder var https = require("https");basiert auf Remote-Host
Prayagupd

was tut ENOTFOUND bedeuten?
Charlie Parker

Antworten:


280

In der Dokumentation des Node.js- HTTP Moduls: http://nodejs.org/api/http.html#http_http_request_options_callback

Sie können entweder anrufen http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback), die URL wird dann analysiert url.parse(); oder anrufen http.get(options, callback), wo optionsist

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

Aktualisieren

Wie im Kommentar von @EnchanterIO angegeben, ist das portFeld auch eine separate Option. und das Protokoll http://sollte nicht in das hostFeld aufgenommen werden. Andere Antworten empfehlen auch die Verwendung eines httpsModuls, wenn SSL erforderlich ist.


16
Danke für die schnelle Antwort, das funktioniert perfekt! Ich möchte meine eigene Frage ablehnen, weil ich die Dokumente nicht zuerst gelesen habe.
Vineet Kosaraju

2
Mein Problem war, dass ich in meinem nodejs-Skript eine Anfrage an die falsche URL stellte und dieser Fehler ausgelöst wurde.
Michael J. Calkins

49
Um es zusammenzufassen: 1. Geben Sie nur den tatsächlichen Hostnamen in an host, also nein http://oder https://; und 2. Fügen Sie den Pfad nicht in die hostEigenschaft ein, sondern in die pathEigenschaft.
Eduard Luca

1
Mein Beispielcode in Learning Node hat mir dies nicht klar gemacht. Jetzt verstehe ich, warum ich seltsame Fehler bekam, als ich den options {...}Block ausfüllte .
Michael Shopsin

+ Stellen Sie sicher, dass sich der Port auch in einem vom Host getrennten Optionsattribut befindet.
Lukas Lukac

240

Eine weitere häufige Fehlerquelle für

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

schreibt das Protokoll (https, https, ...), wenn die hostEigenschaft in festgelegt wirdoptions

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

7
Dies ist ein allgemeinerer Fehler als der besprochene.
Shaunakde

5
Vielen Dank, dass Sie diese alternative Lösung veröffentlicht haben. Genau darauf bin ich gestoßen.
Ryan

Danke @Jorge, ich benutze http.request (), was den gleichen Fehler auslöste, als ich http.get () verwenden wollte, aber ich habe gerade http: // mit http.request () entfernt und gearbeitet.
Shashikant Pandit

17

Wechseln Sie in den Optionen für die HTTP-Anforderung zu

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

Ich denke, das wird dein Problem beheben.


1
Danke für die Antwort! Dies funktioniert auch perfekt, aber ich habe das andere als korrekt markiert, da es einen Link zu den Dokumenten und zwei Optionen enthält.
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);
        });

  });

Danke für die Antwort! Genau wie Russbears Antwort funktioniert diese perfekt, aber ich habe Yuxhuang als richtig markiert, weil er beide Optionen und einen Link zu den Dokumenten gegeben hat.
Vineet Kosaraju

1
Nur Code, ohne zu erklären, was das Problem ist und was die Lösung nicht wirklich eine vollständige Antwort ist. Ich sehe nicht, was Sie in Ihrem Codeblock getan haben, danke.
Al-Mothafar

11

Wenn Sie https verwenden müssen, verwenden Sie die https-Bibliothek

https = require('https');

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

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


7

Ich denke, http stellt eine Anfrage an Port 80, obwohl ich die vollständige Host-URL im Optionsobjekt erwähnt habe. Wenn ich die Serveranwendung mit der API auf Port 80 ausführe, die ich zuvor auf Port 3000 ausgeführt habe, hat es funktioniert. Beachten Sie, dass Sie zum Ausführen einer Anwendung auf Port 80 Root-Rechte benötigen.

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

Hier ist ein vollständiger Code-Ausschnitt

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

Der wichtige Teil dieser Antwort ist das Protokoll. nodejs http unterstützte nicht die vollständige uri mit host: https://server.com, was auch hier erwähnt wird stackoverflow.com/a/28385129/432903
prayagupd

3

Beachten Sie, dass dieses Problem auch auftreten kann, wenn die Domäne, auf die Sie verweisen, ausfällt (z. B. nicht mehr vorhanden.)


3

Ich habe diesen Fehler damit behoben

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

Ursprüngliche Quelle: https://github.com/npm/npm/issues/6686



1

Ich habe es mit dem Anforderungsmodul versucht und konnte den Text dieser Seite ziemlich einfach ausdrucken. Leider kann ich mit meinen Fähigkeiten nicht anders.


Vielen Dank für den Link zum Modul, aber ich hatte gehofft, dies mit der Standardbibliothek node.js unter Verwendung von http.get () zu tun.
Vineet Kosaraju

0

Ich habe diesen Fehler beim Übergang von der Entwicklungsumgebung zur Produktionsumgebung erhalten. Ich war besessen davon, https://alle Links zu setzen. Dies ist nicht erforderlich, daher kann es für einige eine Lösung sein.


0

Ich habe http und extra Schrägstrich (/) losgeworden. Ich habe gerade diese 'node-test.herokuapp.com' verwendet und es hat funktioniert.


0

Wenn Sie immer noch vor der Prüfung für die Proxy-Einstellung stehen, fehlte mir die Proxy-Einstellung, und die Anforderung konnte nicht gestellt werden, da direkte http / https blockiert sind. Also habe ich den Proxy von meiner Organisation aus konfiguriert, während ich die Anfrage gestellt habe.

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

Ich habe dieses Problem behoben, indem ich unerwünschte Zeichen aus dem Kennwort für die Verbindung entfernt habe. Zum Beispiel hatte ich folgende Zeichen: <##% und es verursachte das Problem (höchstwahrscheinlich war das Hash-Tag die Hauptursache des Problems).


0

Versuchen Sie, die Server-IP-Adresse anstelle des Hostnamens zu verwenden. Das hat bei mir funktioniert. Hoffe, es wird auch für Sie funktionieren.


0

Mein Problem war, dass wir die URL analysiert und http_options für http.request () generiert haben.

Ich habe request_url.host verwendet, das bereits eine Portnummer mit dem Domainnamen hatte, also musste request_url.hostname verwendet werden.

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;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.