web-dev-qa-db-fra.com

nodejs httprequest with data - obtention d'une erreur getaddrinfo ENOENT

Mise à jour - Répondu par soi-même

Je vois que l'on doit s'assurer que le DNS est correctement résolu à partir de la machine, consultez la documentation du nœud pour vous assurer que le domaine est résoluble.

Question d'origine

j'écris un programme basé sur des nœuds, dans lequel l'utilisateur peut me demander de faire une httprequest en son nom {bien sûr, il me fournit des données et une méthode pour appeler avec} mais chaque fois que je fais une 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…');
}
36

J'ai vu cela se produire lorsque votre hôte (que vous transmettez en tant que httpaction) a le schéma (donc "http: //") devant lui. Votre hôte doit être strictement le domaine comme "www.google.com" et non " http://www.google.com " ou "www.google.com/hello-world" ou "- http://www.google.com/hello-world ".

Gardez-le juste le domaine.

Voici un exemple: http://allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html

76
Micah

Le problème peut également se produire si vous avez une barre oblique de fin:

Bon:"www.google.com"

Mauvais:"www.google.com/"

8
rockerston

Évitez tous ces problèmes de nom d'hôte/protocole/port/barre oblique en utilisant le module request au lieu de http

https://github.com/mikeal/request

4
jpillora

J'obtenais [Erreur: Getaddrinfo ENOENT], mais c'était juste après avoir obtenu [Erreur: connectez EMFILE]; depuis que je fais des tests de charge avec des milliers de clients, l'erreur EMFILE (la cause première) était en cours d'opaque. La solution était la même que pour EMFILE : augmenter le nombre de descripteurs de fichiers. Il suffit de l'ajouter ici pour être complet au cas où quelqu'un d'autre aurait le même problème.

3
alexfernandez

J'ai frappé à nouveau aujourd'hui pour une erreur stupide. En effet, le numéro de port a été ajouté au nom d'hôte.

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

// correct
var options = {
    hostname: 'localhost',
    port: 1337,
};
3
Sushil

J'obtenais cette erreur lors de l'appel de server.listen(PORT, Host); où l'hôte n'a pas pu être résolu sur la machine locale.

Une fois que j'ai changé cela en un nom d'hôte/nom de domaine/ip que la machine locale a résolu, cette erreur a disparu.

Comme j'essayais de me connecter via un nom d'hôte à des fins de développement, j'ai ajouté une entrée à mon fichier d'hôtes avec le nom d'hôte souhaité et je me suis assuré que cela correspondait au nom d'hôte passé à server.listen()

2
russholio

Si tout votre code semble correct et que vous obtenez toujours la même erreur, ce qui était mon cas, la solution consistait à vérifier les serveurs de noms sur mon /etc/resolv.conf fichier.

J'ai ajouté le serveur de noms de Google au début de mon resolv.conf fichier (8.8.8.8) et le code a recommencé à fonctionner correctement, plus d'erreur.

Il convient de noter que cette erreur a commencé à se produire sur moi le 4 février 2015 après avoir exécuté un Sudo apt-get upgrade, mon noeud js doit avoir é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 bien obtenu le contenu de l'URL cible, donc je ne pensais pas qu'il s'agissait en fait d'un problème DNS , mais c'était.

0
Gubatron

J'ai eu un problème similaire mais fonctionnant en tant que fonction AWS Lambda, donc au cas où quelqu'un aurait ce problème avec les fonctions Lambda, voici comment 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 ce correctif, j'espère qu'il aide quelqu'un d'autre.

0
Ninos