Node.js getaddrinfo ENOTFOUND

265

Cuando utilice Node.js para intentar obtener el contenido html de la siguiente página web:

eternagame.wikia.com/wiki/EteRNA_Dictionary

Obtuve el siguiente error:

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)

Ya busqué este error en stackoverflow, y me di cuenta de que esto se debe a que node.js no puede encontrar el servidor desde DNS (creo). Sin embargo, no estoy seguro de por qué sería así, ya que mi código funciona perfectamente www.google.com.

Aquí está mi código (prácticamente copiado y pegado de una pregunta muy similar, excepto con el host cambiado):

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

Aquí está la fuente desde donde copié y pegué: ¿Cómo hacer llamadas de servicio web en Expressjs?

No estoy usando ningún módulo con node.js.

Gracias por leer.

Vineet Kosaraju
fuente
tuvo que usar var http = require("http");o var https = require("https");basado en host remoto
prayagupd
que ENOTFOUND significa
Charlie Parker

Respuestas:

280

En la documentación del módulo Node.js HTTP : http://nodejs.org/api/http.html#http_http_request_options_callback

Puede llamar http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback), luego se analiza la URL url.parse(); o llame http.get(options, callback), donde optionsesta

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

Actualizar

Como se indicó en el comentario de @EnchanterIO, el portcampo también es una opción separada; y el protocolo http://no debe incluirse en el hostcampo. Otras respuestas también recomiendan el uso del httpsmódulo si se requiere SSL.

yuxhuang
fuente
16
Gracias por la rápida respuesta, ¡esto funciona perfectamente! Tengo ganas de votar mi propia pregunta por no leer los documentos primero.
Vineet Kosaraju
2
Mi problema fue que dentro de mi script nodejs estaba haciendo una solicitud a la URL incorrecta y se produjo este error.
Michael J. Calkins
49
Básicamente, para resumirlo: 1. Solo incluya el nombre de host real en host, entonces no http://o https://; y 2. No incluya la ruta en la hostpropiedad, sino más bien en la pathpropiedad.
Eduard Luca
1
Mi código de muestra en Learning Node no me lo dejó claro. Ahora entiendo por qué tuve fallas extrañas cuando completé el options {...}bloque.
Michael Shops en
+ asegúrese de que el puerto también esté en un atributo de opción separado del host.
Lukas Lukac
240

Otra fuente común de error para

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

está escribiendo el protocolo (https, https, ...) al establecer la hostpropiedad enoptions

  // DON'T WRITE THE `http://`
  var options = { 
    host: 'http://yoururl.com',
    path: '/path/to/resource'
  }; 
Jorge Bucaran
fuente
77
Este es un error más general que el discutido.
shaunakde
55
Gracias por publicar esta solución alternativa, me estaba encontrando con esto exactamente.
Ryan
Gracias @Jorge, estoy usando http.request () que arrojó un error igual que iba a usar http.get () pero simplemente eliminé http: // con http.request () y funcionó.
Shashikant Pandit
17

en las opciones para la solicitud HTTP, cámbiela a

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

Creo que eso solucionará tu problema.

Russbear
fuente
1
¡Gracias por la respuesta! Esto también funciona perfectamente, pero marqué el otro como correcto porque tiene un enlace a los documentos y dos opciones.
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);
        });

  });
sachin
fuente
¡Gracias por la respuesta! Al igual que la respuesta de Russbear, esta funciona perfectamente, pero marqué la correcta de yuxhuang porque dio ambas opciones y un enlace a los documentos.
Vineet Kosaraju
1
Simplemente codifique sin explicar cuál es el problema y cuál es la solución no es realmente una respuesta completa, no veo lo que hizo en su bloque de código, gracias.
Al-Mothafar
11

Si necesita usar https, use la biblioteca https

https = require('https');

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

// get
https.get(options, callback);
Andrés
fuente
8

Mi problema era que mi servicio DNS OS X (Mavericks) necesitaba ser reiniciado .

aaaidan
fuente
7

Creo que http realiza una solicitud en el puerto 80, a pesar de que mencioné la URL completa del host en el objeto de opciones. Cuando ejecuté la aplicación del servidor que tiene la API, en el puerto 80, que estaba ejecutando anteriormente en el puerto 3000, funcionó. Tenga en cuenta que para ejecutar una aplicación en el puerto 80 necesitará privilegios de root.

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

Aquí hay un fragmento de código 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();
Mahtab Alam
fuente
La parte importante de esta respuesta es el protocolo. nodejs http no era compatible con uri completa host: https://server.com, que también se menciona aquí stackoverflow.com/a/28385129/432903
prayagupd
3

Tenga en cuenta que este problema también puede ocurrir si el dominio al que hace referencia deja de funcionar (por ejemplo, ya no existe).

Mauvis Ledford
fuente
3

Arregle este error con esto

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

Fuente original: https://github.com/npm/npm/issues/6686

Mertcan Diken
fuente
1

Lo probé usando el módulo de solicitud y pude imprimir el cuerpo de esa página con bastante facilidad. Desafortunadamente con las habilidades que tengo, no puedo ayudar más que eso.

AberZombie
fuente
Gracias por el enlace al módulo, pero esperaba hacerlo con la biblioteca estándar node.js, usando http.get ().
Vineet Kosaraju
0

Recibí este error al pasar del entorno de desarrollo al entorno de producción. Estaba obsesionado con poner https://todos los enlaces. Esto no es necesario, por lo que puede ser una solución para algunos.

petur
fuente
0

Me deshice de http y extra slash (/). Acabo de usar este 'node-test.herokuapp.com' y funcionó.

Uday Reddy
fuente
0

Si aún se enfrenta a la comprobación de la configuración del proxy, para mí fue la configuración del proxy la que faltaba y no pude realizar la solicitud ya que los http / https directos están bloqueados. Así que configuré el proxy de mi organización al hacer la solicitud.

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
};
Ansar Ahmed
fuente
0

Este problema se resolvió eliminando los caracteres no deseables de la contraseña para la conexión. Por ejemplo, tenía estos caracteres: <##% y causó el problema (lo más probable es que la etiqueta hash fuera la causa principal del problema).

Shota
fuente
0

Intente usar la dirección IP del servidor en lugar del nombre de host. Esto funcionó para mí. Espero que funcione para ti también.

Hemantkumar Gaikwad
fuente
0

Mi problema fue que estábamos analizando url y generando http_options para http.request ();

Estaba usando request_url.host que ya tenía un número de puerto con el nombre de dominio, así que tuve que usar 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;
Arjun J Gowda
fuente