Node.js getaddrinfo ENOTFOUND


265

Quando si utilizza Node.js per provare a ottenere il contenuto html della seguente pagina Web:

eternagame.wikia.com/wiki/EteRNA_Dictionary

Ottengo il seguente errore:

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)

Ho già cercato questo errore su StackOverflow e mi sono reso conto che ciò è dovuto al fatto che node.js non riesce a trovare il server dal DNS (credo). Tuttavia, non sono sicuro del perché, dato che il mio codice funziona perfettamente www.google.com.

Ecco il mio codice (praticamente copiato e incollato da una domanda molto simile, tranne che con l'host modificato):

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

Ecco la fonte da cui ho copiato e incollato: Come effettuare chiamate al servizio Web in Expressjs?

Non sto usando alcun modulo con node.js.

Grazie per aver letto.



ha dovuto utilizzare var http = require("http");o var https = require("https");basato su host remoto
prayagupd

cosa ENOTFOUND significa?
Charlie Parker,

Risposte:


280

Nella documentazione del modulo Node.js HTTP : http://nodejs.org/api/http.html#http_http_request_options_callback

Puoi chiamare http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback), l'URL viene quindi analizzato url.parse(); o chiamare http.get(options, callback), dove optionsè

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

Aggiornare

Come affermato nel commento di @EnchanterIO, il portcampo è anche un'opzione separata; e il protocollo http://non dovrebbe essere incluso nel hostcampo. Altre risposte raccomandano anche l'uso del httpsmodulo se è richiesto SSL.


16
Grazie per la rapida risposta, funziona perfettamente! Ho voglia di sottovalutare la mia domanda per non aver letto prima i documenti.
Vineet Kosaraju,

2
Il mio problema era che all'interno del mio script nodejs stavo facendo una richiesta all'URL sbagliato e questo errore è stato generato.
Michael J. Calkins,

49
Quindi, in sostanza, per riassumere: 1. Includere solo il nome host effettivo in host, quindi no http://o https://; e 2. Non includere il percorso nella hostproprietà, ma piuttosto nella pathproprietà.
Eduard Luca,

1
Il mio codice di esempio in Learning Node non me lo ha reso chiaro. Ora capisco perché ho avuto strani errori quando ho compilato il options {...}blocco.
Michael Shopsin

+ assicurarsi che la porta sia anche in un attributo di opzione separato dall'host.
Lukas Lukac,

240

Un'altra fonte comune di errore per

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

sta scrivendo il protocollo (https, https, ...) quando si imposta la hostproprietà inoptions

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

7
Questo è un errore più generale di quello discusso.
Shaunakde,

5
Grazie per aver pubblicato questa soluzione alternativa, mi sono imbattuto esattamente in questo.
Ryan,

Grazie @Jorge sto usando http.request () che ha generato l'errore lo stesso che stavo per usare http.get () ma ho appena rimosso http: // con http.request () e ho funzionato.
Shashikant Pandit,

17

nelle opzioni per la richiesta HTTP, passa a

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

Penso che risolverà il tuo problema.


1
Grazie per la risposta! Anche questo funziona perfettamente, ma ho contrassegnato l'altro come corretto perché ha un collegamento ai documenti e due opzioni.
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);
        });

  });

Grazie per la risposta! Proprio come la risposta di Russbear, questa funziona perfettamente, ma ho contrassegnato la correttezza di yuxhuang perché ha fornito entrambe le opzioni e un collegamento ai documenti.
Vineet Kosaraju,

1
Basta codificare senza spiegare quale sia il problema e quale soluzione non sia davvero una risposta completa, non vedo cosa hai fatto nel tuo blocco di codice, grazie.
Al-Mothafar,

11

Se è necessario utilizzare https, utilizzare la libreria https

https = require('https');

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

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


7

Penso che http faccia richiesta sulla porta 80, anche se ho citato l'URL completo dell'host nell'oggetto opzioni. Quando eseguo l'applicazione server che ha l'API, sulla porta 80, che stavo eseguendo in precedenza sulla porta 3000, ha funzionato. Si noti che per eseguire un'applicazione sulla porta 80 è necessario il privilegio di root.

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

Ecco uno snippet di codice completo

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

la parte importante in questa risposta è il protocollo. nodejs http non ha sostenuto URI completo con host: https://server.com, di cui si parla anche qui stackoverflow.com/a/28385129/432903
prayagupd

3

Si noti che questo problema può verificarsi anche se il dominio a cui si fa riferimento non funziona (ad es. Non esiste più).


3

Ho risolto questo errore con questo

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

Fonte originale: https://github.com/npm/npm/issues/6686



1

L'ho provato usando il modulo di richiesta ed è stato in grado di stampare abbastanza facilmente il corpo di quella pagina. Sfortunatamente con le competenze che ho, non posso fare a meno di quello.


Grazie per il link al modulo, ma speravo di farlo con la libreria standard node.js, usando http.get ().
Vineet Kosaraju,

0

Ho riscontrato questo errore passando dall'ambiente di sviluppo all'ambiente di produzione. Ero ossessionato dal mettere https://su tutti i collegamenti. Questo non è necessario, quindi potrebbe essere una soluzione per alcuni.


0

Mi sono sbarazzato di http e barra extra (/). Ho appena usato questo 'node-test.herokuapp.com' e ha funzionato.


0

Se stai ancora affrontando il checkout per l'impostazione del proxy, per me era l'impostazione del proxy che mancava e non è stata in grado di effettuare la richiesta poiché gli indirizzi http / https diretti sono bloccati. Quindi ho configurato il proxy dalla mia organizzazione mentre facevo la richiesta.

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

Ho risolto questo problema rimuovendo i caratteri non desiderabili dalla password per la connessione. Ad esempio, avevo questi caratteri: <##% e questo causava il problema (molto probabilmente il tag hash era la causa principale del problema).


0

Prova a utilizzare l'indirizzo IP del server anziché il nome host. Questo ha funzionato per me. Spero che funzionerà anche per te.


0

Il mio problema era che stavamo analizzando url e generando http_options per http.request ();

Stavo usando request_url.host che aveva già il numero di porta con il nome di dominio, quindi ho dovuto usare 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;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.