nodejs httprequest avec des données d'erreur getaddrinfo ENOENT
mise à Jour en réponse par soi-même
je vois que l'on doit s'assurer que le DNS est résolu correctement à partir de la machine, vérifiez la documentation de noeud pour s'assurer que le domaine est résoluble.
Question Originale
j'écris un programme basé sur les noeuds, dans lequel l'utilisateur peut me demander de faire une httprequest en leur nom {bien sûr, ils me fournissent quelques données, et une méthode pour appeler} mais chaque fois que je fais un httprequest il me donne une erreur
getaddrinfo ENOENT voici à quoi ressemble mon code
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…');
}
8 réponses
j'ai vu cela arriver quand votre hôte (que vous passez en httpaction) a le schéma (donc" http://") devant lui. Votre hôte doit être strictement le domaine comme "www.google.com" pas " http://www.google.com " ou "www.google.com/hello-world" ou " http://www.google.com/hello-world ".
Garder juste le domaine.
voici un exemple: http://allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html
Le problème peut également se produire si vous avez une barre oblique:
Bonne: "www.google.com"
Mauvais: "www.google.com/"
éviter tous ces problèmes nom d'hôte / protocole / port/slash en utilisant le module request
au lieu de http
j'obtenais [Error: Getaddrinfo ENOENT], mais c'était juste après avoir obtenu [Error: connect EMFILE]; depuis que je fais des tests de charge avec des milliers de clients L'erreur D'EMFILE (la cause racine) était opaqued. La solution était la même que pour EMFILE : augmenter le nombre de descripteurs de fichier. Il suffit de l'ajouter ici pour être complet au cas où quelqu'un d'autre aurait le même problème.
j'ai frappé à nouveau aujourd'hui pour une erreur stupide. C'est parce que le numéro de port a été placé dans le nom d'hôte.
// wrong. gets error getaddrinfo ENOENT
var options = {
hostName: 'localhost:1337',
....
}
// correct
var options = {
hostname: 'localhost',
port: 1337,
};
j'ai eu cette erreur en appelant server.listen(PORT, HOST);
où L'hôte ne pouvait pas être résolu à la machine locale.
une fois que j'ai changé ce nom de nouveau à un nom d'hôte/nom de domaine/adresse ip que la machine locale a résolu, cette erreur a disparu.
depuis que j'ai essayé de me connecter via un nom d'hôte pour les besoins du dev j'ai ajouté une entrée à mon fichier hosts avec le nom d'hôte désiré et j'ai veillé à ce que cela corresponde au nom d'hôte passé à server.listen()
si tout votre code semble correct et que vous avez toujours la même erreur, ce qui était mon cas, la solution était de vérifier les serveurs de noms sur mon fichier /etc/resolv.conf
.
j'ai ajouté le serveur de noms de Google au début de mon fichier resolv.conf
(8.8.8.8) et le code a commencé à fonctionner très bien une fois de plus, plus d'erreur.
il est intéressant de noter que cette erreur a commencé à se produire sur moi le février. 4th 2015 après avoir couru un sudo apt-get upgrade
, mon noeud js doit ont été mis à jour et un bug introduit qui semblait incompatible avec les serveurs de noms que j'avais.
au début j'ai vérifié si j'avais des problèmes DNS en récupérant L'URL dont j'avais besoin en utilisant wget
sur la ligne de commande, j'ai obtenu le contenu de l'url cible très bien donc je ne pensais pas que c'était en fait un problème DNS, mais il l'était.
j'ai eu un problème similaire mais courant comme une fonction Lambda AWS, donc au cas où quelqu'un a ce problème avec les fonctions Lambda c'est comme ça que je l'ai résolu.
- donnez à votre fonction Lambda un VPC.
- sélectionnez au moins 2 sous-réseaux.
- et sélectionnez un groupe de sécurité.
j'ai passé une journée jusqu'à ce que je trouve cette solution, j'espère qu'elle aide quelqu'un d'autre.