node.js - telemetry - requesterror error getaddrinfo enotfound
nodejs httprequest con datos-obteniendo el error getaddrinfo ENOENT (8)
El problema también puede ocurrir si tienes una barra inclinada final:
Bueno: "www.google.com"
Malo: "www.google.com/"
Actualización - Respondida por uno mismo
Veo que uno tiene que asegurarse de que el DNS se resuelva correctamente desde la máquina, revise la documentación del nodo para asegurarse de que ese dominio se pueda resolver.
Pregunta original
Estoy escribiendo un programa basado en nodos, en el que el usuario puede pedirme que haga una httprequest en su nombre {por supuesto que me proporcionan algunos datos y un método para llamar}, pero cada vez que hago una httprequest me da un error
getaddrinfo ENOENT así es como se ve mi código
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…'');
}
Estaba obteniendo [Error: Getaddrinfo ENOENT], pero fue justo después de obtener [Error: connect 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 la misma que para 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.
Estaba recibiendo este error al llamar a server.listen(PORT, HOST);
donde HOST no se pudo resolver de nuevo a 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 intentaba conectarme a través de un nombre de host para propósitos de desarrollo, agregué una entrada al archivo de hosts con el nombre de host deseado y me aseguré de que coincidiera con el nombre de host pasado a server.listen()
Evite todos estos problemas de nombre de host / protocolo / puerto / barra usando el módulo de request
lugar de http
Golpeé esto hoy nuevamente 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,
};
He visto esto suceder cuando su host (que pasa como httpaction) tiene el esquema (por lo que "http: //") delante de él. 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 ". http://www.google.com/hello-world ".
Mantenlo solo en el dominio.
Aquí hay un ejemplo: http://allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html
Si todo su código parece estar bien y todavía obtiene el mismo error, que era mi caso, la solución era 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 notar que este error comenzó a ocurrir en mí el 4 de febrero de 2015 después de ejecutar una sudo apt-get upgrade
, mi nodo js debe haber sido actualizado y se presentó un error que parecía ser incompatible con los servidores de nombres que tenía.
Al principio, verifiqué si tenía algún problema con el DNS al obtener la URL que necesitaba usando wget
en la línea de comandos, conseguí que el contenido de la URL de destino fuera correcto, así que no pensé que realmente era un problema de DNS, pero sí lo era.
Tenía un problema similar pero funcionaba como una función AWS Lambda, por lo que, en caso de que alguien tenga este problema con las funciones de Lambda, así es como lo resolví.
- Dale a tu función Lambda una VPC.
- Seleccione al menos 2 subredes.
- Y seleccione un grupo de seguridad.
Pasé un día hasta que encontré esta solución, espero que ayude a otra persona.