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…');
}
35
demandé sur mikemaccana 2012-03-06 12:31:39

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

75
répondu Micah 2012-03-20 03:14:48

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

Bonne: "www.google.com"

Mauvais: "www.google.com/"

8
répondu rockerston 2012-11-02 02:50:36

éviter tous ces problèmes nom d'hôte / protocole / port/slash en utilisant le module request au lieu de http

https://github.com/mikeal/request

4
répondu jpillora 2013-08-14 00:19:39

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.

3
répondu alexfernandez 2017-05-23 12:10:05

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,
};
3
répondu Sushil 2013-05-08 04:45:58

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()

2
répondu russholio 2012-10-30 03:21:49

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.

0
répondu Gubatron 2015-02-04 22:33:03

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.

0
répondu Ninos 2017-02-01 00:53:01