2012-03-06 21 views
33

Aggiornamento - Risposta automatica Vedo che uno deve assicurarsi che il DNS sia stato risolto correttamente dalla macchina, controlla questo codice per assicurarti che l'URL sia raggiungibile nodejs.org/ docs/ultima/api/dns.html # dns.resolvenodejs httprequest con dati - errore getaddrinfo ENOENT

domanda iniziale

sto scrivendo un programma basato nodi, in cui l'utente può chiedere a me di fare un HttpRequest per loro conto {fuori rotta mi forniscono alcuni dati e un metodo per chiamare con} ma ogni volta che faccio un httprequest mi dà un errore

getaddrinfo ENOENT questo è come il mio codice è

function makehttprequest(deviceid, httpaction, httppath,methods, actiondata, callback) { 
console.log('we are here with httpaction' + httpaction + ' path ' + httppath + ' method ' + methods + ' action data ' + actiondata); 
//do the http post work, get the data, and call the callback function with return data 
var options = { 
    host: httpaction, 
    port: 80, 
    path: httppath, 
    method: methods 
}; 

    try { 
     var req = http.request(options, function(res) { 
     console.log('STATUS: ' + res.statusCode); 
     console.log('HEADERS: ' + JSON.stringify(res.headers)); 
     res.setEncoding('utf8'); 
     res.on('data', function (chunk) { 
      console.log('BODY: ' + chunk); 
     }); 
     }); 
    } catch(e) { 
     console.log('error as : ' + e.message); 
    } 

    req.on('error', function(e) { 
     console.log('problem with request: ' + e.message); 
    }); 

    // write data to request body 
    console.log('writing data to request ..'); 
    req.write(actiondata); 
    console.log('finished writing data to request…'); 
    req.end(); 
    console.log('request ended…'); 
} 
+1

Per lo sviluppo locale utilizzare 127.0.0.1 anziché localhost –

risposta

74

Ho visto questo accadere quando il vostro ospite (che si passa come httpaction) ha lo schema (in modo da "http: //") davanti di esso. Il tuo host dovrebbe essere rigorosamente dominio come "www.google.com" non "http://www.google.com" o "www.google.com/hello-world" o "http://www.google.com/hello-world".

Mantieni solo il dominio.

Ecco un esempio: http://allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html

+1

+1 per "www.google.com" come nome host anziché "http://www.google.com". Questo ha risolto il mio problema. – Eye

+0

Sei un ragazzo fantastico! Non l'avrei capito. – Slavo

+0

E se avessi bisogno di https: //? Se lo salti, il valore predefinito diventerà http: // –

3

mi è stato sempre [Errore: Getaddrinfo ENOENT], ma è stato subito dopo ottenere [Errore: collegare EMFILE]; poiché eseguo test di carico con migliaia di client, l'errore EMFILE (la causa principale) veniva opacizzato. La soluzione era the same as for EMFILE: aumentare il numero di descrittori di file. Aggiungilo qui per completezza nel caso in cui qualcun altro abbia lo stesso problema.

2

Si è verificato questo errore quando si chiama server.listen(PORT, HOST); dove HOST non può essere risolto sul computer locale.

Una volta modificato questo parametro in un nome host/nome di dominio/ip a cui è stato risolto il computer locale, questo errore è andato via.

Dal momento che stavo cercando di connettersi tramite un hostname per scopi dev ho aggiunto una voce al mio file host con il nome host desiderato e ha assicurato che questo abbinato il nome dell'host passato a server.listen()

8

Il problema può verificarsi anche se si dispone di slash:

buono:"www.google.com"

Bad:"www.google.com/"

3

Oggi l'ho colpito ancora per un errore stupido. Questo perché il numero di porta è stato inserito come parte del nome host.

// wrong. gets error getaddrinfo ENOENT 
var options = { 
    hostName: 'localhost:1337', 
    .... 
} 

// correct 
var options = { 
    hostname: 'localhost', 
    port: 1337, 
}; 
+0

Se si sta estraendo il nome host dalle intestazioni delle richieste (comune per proxy), semplicemente request.headers ['host']. Split (':') [0] per sbarazzarsi della porta – netpoetica

0

request Se tutto il codice sembra essere a posto e si sta ancora ottenere lo stesso errore, che era il mio caso, la soluzione stava controllando i nameserver sul mio file /etc/resolv.conf.

Ho aggiunto il server dei nomi di Google all'inizio del mio file resolv.conf (8.8.8.8) e il codice ha iniziato a funzionare bene, ancora una volta, senza più errori.

Vale la pena notare che questo errore ha iniziato a verificarsi su di me il 4 febbraio 2015 dopo che ho eseguito uno sudo apt-get upgrade, il mio nodo js deve essere stato aggiornato e un bug introdotto che sembrava essere incompatibile con i server dei nomi che avevo.

In un primo momento ho controllato se stavo riscontrando problemi DNS recuperando l'URL di cui avevo bisogno utilizzando wget sulla riga di comando, ho ottenuto il contenuto dell'url di destinazione bene, quindi non pensavo che fosse in realtà un problema DNS, ma era.

0

Avevo un problema simile ma in esecuzione come funzione AWS Lambda, quindi nel caso in cui qualcuno stia riscontrando questo problema con le funzioni Lambda, questo è il modo in cui l'ho risolto.

  • Assegna alla funzione Lambda un VPC.
  • Selezionare almeno 2 sottoreti.
  • E selezionare un gruppo di sicurezza.

Ho passato un giorno fino a quando ho trovato questa correzione, spero che aiuti qualcun altro.