web-dev-qa-db-fra.com

Node.js getaddrinfo ENOTFOUND

Lorsque vous utilisez Node.js, essayez d’obtenir le contenu HTML de la page Web suivante:

eternagame.wikia.com/wiki/EteRNA_Dictionary

Je reçois l'erreur suivante:

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: getaddrinfo ENOTFOUND
    at errnoException (dns.js:37:11)
    at Object.onanswer [as oncomplete] (dns.js:124:16)

J'ai déjà recherché cette erreur sur stackoverflow et me suis rendu compte que c'était parce que node.js ne pouvait pas trouver le serveur à partir du DNS (je pense). Cependant, je ne suis pas sûr de savoir pourquoi, car mon code fonctionne parfaitement sur www.google.com.

Voici mon code (pratiquement copié et collé à partir d'une question très similaire, sauf que l'hôte a été modifié):

var http = require("http");

var options = {
    Host: 'eternagame.wikia.com/wiki/EteRNA_Dictionary'
};

http.get(options, function (http_res) {
    // initialize the container for our data
    var data = "";

    // this event fires many times, each time collecting another piece of the response
    http_res.on("data", function (chunk) {
        // append this chunk to our growing `data` var
        data += chunk;
    });

    // this event fires *one* time, after all the `data` events/chunks have been gathered
    http_res.on("end", function () {
        // you can use res.send instead of console.log to output via express
        console.log(data);
    });
});

Voici la source d'où j'ai copié et collé: Comment faire des appels de service Web dans Expressjs?

Je n'utilise aucun module avec node.js.

Merci d'avoir lu,

Vigne

198
Vineet Kosaraju

Dans la documentation du module Node.jsHTTP: http://nodejs.org/api/http.html#http_http_request_options_callback

Vous pouvez appeler http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback), l’URL est ensuite analysée avec url.parse(); ou appelez http.get(options, callback), où options est

{
  Host: 'eternagame.wikia.com',
  port: 8080,
  path: '/wiki/EteRNA_Dictionary'
}

Mettre à jour

Comme indiqué dans le commentaire de @EnchanterIO, le champ port est également une option distincte; et le protocole http:// ne devrait pas être inclus dans le champ Host. D'autres réponses recommandent également l'utilisation du module https si SSL est requis.

212
yuxhuang

Une autre source d'erreur commune pour

Error: getaddrinfo ENOTFOUND
    at errnoException (dns.js:37:11)
    at Object.onanswer [as oncomplete] (dns.js:124:16)

est en train d'écrire le protocole (https, https, ...) lorsque vous définissez la propriété Host dans options

  // DON'T WRITE THE `http://`
  var options = { 
    Host: 'http://yoururl.com',
    path: '/path/to/resource'
  }; 
214
Jorge Bucaran

dans les options de la requête HTTP, réglez-le sur

var options = { Host: 'eternagame.wikia.com', 
                path: '/wiki/EteRNA_Dictionary' };

Je pense que ça va régler ton problème.

16
Russbear
  var http=require('http');
   http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', function(res){
        var str = '';
        console.log('Response is '+res.statusCode);

        res.on('data', function (chunk) {
               str += chunk;
         });

        res.on('end', function () {
             console.log(str);
        });

  });
11
sachin

Si vous devez utiliser https, utilisez la bibliothèque https.

https = require('https');

// options
var options = {
    Host: 'eternagame.wikia.com',
    path: '/wiki/EteRNA_Dictionary'
}

// get
https.get(options, callback);
10
Andrew

Mon problème était que mon service DNS OS X (Mavericks) devait être redémarré

6
aaaidan

Je pense que http fait une demande sur le port 80, même si j'ai mentionné l'URL complète de l'hôte dans l'objet options. Lorsque j'exécutais l'application serveur dotée de l'API, sur le port 80, que j'utilisais précédemment sur le port 3000, cela fonctionnait. Notez que pour exécuter une application sur le port 80, vous aurez besoin du privilège root.

Error with the request: getaddrinfo EAI_AGAIN localhost:3000:80

Voici un extrait de code complet

var http=require('http');

var options = {
  protocol:'http:',  
  Host: 'localhost',
  port:3000,
  path: '/iso/country/Japan',
  method:'GET'
};

var callback = function(response) {
  var str = '';

  //another chunk of data has been recieved, so append it to `str`
  response.on('data', function (chunk) {
    str += chunk;
  });

  //the whole response has been recieved, so we just print it out here
  response.on('end', function () {
    console.log(str);
  });
}

var request=http.request(options, callback);

request.on('error', function(err) {
        // handle errors with the request itself
        console.error('Error with the request:', err.message);        
});

request.end();
3
Mahtab Alam

Notez que ce problème peut également se produire si le domaine que vous référencez tombe en panne (EG. N'existe plus.)

3
Mauvis Ledford

J'ai corrigé cette erreur avec ça

$ npm info express --verbose
# Error message: npm info retry will retry, error on last attempt: Error: getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443
$ nslookup registry.npmjs.org
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
registry.npmjs.org  canonical name = a.sni.fastly.net.
a.sni.fastly.net    canonical name = prod.a.sni.global.fastlylb.net.
Name:   prod.a.sni.global.fastlylb.net
Address: 151.101.32.162
$ Sudo vim /etc/hosts 
# Add "151.101.32.162 registry.npmjs.org` to hosts file
$ npm info express --verbose
# Works now!

Source originale: https://github.com/npm/npm/issues/6686

2
Mertcan Diken

Je recevais la même erreur et utilisé ci-dessous le lien ci-dessous pour obtenir de l'aide:

https://nodejs.org/api/http.html#http_http_request_options_callback

Je n'avais pas dans mon code: 

req.end();

((NodeJs V: 5.4.0) Une fois ajoutée au-dessus de la ligne req.end();, j'ai pu supprimer l'erreur et j'ai bien fonctionné.

2
sudeep patel

Je l'ai essayé en utilisant le module request , et j'ai pu imprimer le corps de cette page assez facilement. Malheureusement, avec les compétences que j'ai, je ne peux pas aider autrement.

1
AberZombie

J'ai eu cette erreur lorsque je suis passé d'un environnement de développement à un environnement de production. J'étais obsédé par mettre https:// sur tous les liens. Ce n'est pas nécessaire, ce pourrait donc être une solution pour certains.

0
petur

Essayez d’utiliser l’adresse IP du serveur plutôt que le nom d’hôte… .. Cela a fonctionné pour moi. J'espère que cela fonctionnera pour vous aussi.

0

Si vous êtes toujours confronté à la validation du paramétrage du proxy, c’est le paramètre du proxy qui était manquant et qui n’a pas été en mesure de faire la demande, car http/https direct sont bloqués. J'ai donc configuré le proxy de mon entreprise lors de la demande.

npm install https-proxy-agent 
or 
npm install http-proxy-agent

const httpsProxyAgent = require('https-proxy-agent');
const agent = new httpsProxyAgent("http://yourorganzation.proxy.url:8080");
const options = {
  hostname: 'encrypted.google.com',
  port: 443,
  path: '/',
  method: 'GET',
  agent: agent
};
0
Ansar Ahmed

J'ai résolu ce problème en supprimant les caractères non souhaitables du mot de passe pour la connexion. Par exemple, j'avais les caractères suivants: <##% et cela était à l'origine du problème (la balise hash était probablement à l'origine du problème).

0
Shota

Mon problème était que nous analysions l'URL et générions http_options pour http.request ();

J'utilisais request_url.Host qui avait déjà un numéro de port avec le nom de domaine, donc je devais utiliser request_url.hostname.

var request_url = new URL('http://example.org:4444/path');
var http_options = {};

http_options['hostname'] = request_url.hostname;//We were using request_url.Host which includes port number
http_options['port'] = request_url.port;
http_options['path'] = request_url.pathname;
http_options['method'] = 'POST';
http_options['timeout'] = 3000;
http_options['rejectUnauthorized'] = false;
0
Arjun J Gowda

Je me suis débarrassé de http et de la barre oblique supplémentaire (/). Je viens d'utiliser ce 'test de nœud.herokuapp.com' et cela a fonctionné.

0
Uday Reddy