2012-03-06 22 views
33

Actualización - Respondido por uno mismo Veo que uno tiene que asegurarse de que el DNS se resuelva correctamente desde la máquina, consulte este código para asegurarse de que la url sea alcanzable nodejs.org/ docs/última/api/dns.html # dns.resolvenodejs httprequest con datos - obteniendo el error getaddrinfo ENOENT

pregunta original

estoy escribiendo un programa basado en los nodos, en la que el usuario me puede pedir que hagamos una HttpRequest en su nombre {fuera de curso me proporcionan algunos datos y un método para llamar con} pero cada vez que hago una httprequest me da un error

getaddrinfo ENOENT Así es como mi código es

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

Para desarrollo local utilice 127.0.0.1 en lugar de localhost –

Respuesta

74

He visto esto suceder cuando su anfitrión (que se pasa en tan httpaction) tiene el esquema (por lo que "http: //") delante de eso Su host debe ser estrictamente el dominio como "www.google.com", no "http://www.google.com" o "www.google.com/hello-world" o "http://www.google.com/hello-world".

Guárdelo solo el dominio.

He aquí un ejemplo: http://allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html

+1

+1 para "www.google.com" como nombre de host en lugar de "http://www.google.com". Esto resolvió mi problema. – Eye

+0

¡Eres un tipo increíble! No me hubiera dado cuenta de esto. – Slavo

+0

¿Qué pasa si necesitas https: //? Si se salta, el valor predeterminado será http: // –

3

que estaba recibiendo [Error: Getaddrinfo ENOENT], pero estaba justo después de conseguir [Error: conectar EMFILE]; dado que estoy haciendo pruebas de carga con miles de clientes, el error EMFILE (la causa raíz) estaba siendo opacado. La solución fue the same as for EMFILE: aumentar el número de descriptores de archivos. Solo agrégalo aquí para completarlo en caso de que alguien más tenga el mismo problema.

2

Recibí este error al llamar al server.listen(PORT, HOST); donde HOST no se pudo resolver de nuevo en la máquina local.

Una vez que cambié esto a un nombre de host/nombre de dominio/ip que la máquina local resolvió, este error desapareció.

Como yo estaba tratando de conectarse a través de un nombre de host para los propósitos dev he añadido una entrada a mi archivo de hosts con el nombre de host deseada y se aseguró de que este juego con el nombre de host pasado a server.listen()

8

El problema también puede ocurrir si usted tiene una barra final:

bueno:"www.google.com"

malo:"www.google.com/"

3

Toco esto de nuevo hoy por un error tonto. Esto fue porque el número de puerto se puso como parte del nombre de host.

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

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

Si está extrayendo el nombre de host de los encabezados de solicitud (común para el proxy), simplemente request.headers ['host']. Split (':') [0] para deshacerse del puerto – netpoetica

0

request Si todo el código parece estar bien y todavía estás llegar el mismo error, que era mi caso, la solución fue verificar los servidores de nombres en mi archivo /etc/resolv.conf.

Agregué el servidor de nombres de Google al comienzo de mi archivo resolv.conf (8.8.8.8) y el código comenzó a funcionar bien una vez más, no hubo más errores.

Vale la pena observar que este error comenzó a ocurrir en mí el 4 de febrero de 2015 después de ejecutar sudo apt-get upgrade, mi nodo js debe haber sido actualizado y apareció un error que parecía ser incompatible con los servidores de nombres que tenía.

Al principio verifiqué si tenía algún problema de DNS obteniendo la URL que necesitaba usando wget en la línea de comandos, obtuve los contenidos de la URL de destino bien, así que no pensé que en realidad era un problema de DNS, pero fue.

0

Tuve un problema similar pero funcionaba como una función de AWS Lambda, por lo que si alguien tiene este problema con las funciones de Lambda, así es como lo resolví.

  • Déle a su función Lambda una VPC.
  • Seleccione al menos 2 subredes.
  • Y seleccione un grupo de seguridad.

pasé un día hasta que encontré esta revisión, esperemos que ayuda a otra persona.

Cuestiones relacionadas