Node.js getaddrinfo ENOTFOUND


265

Lorsque vous utilisez Node.js pour essayer d'obtenir le contenu html de la page Web suivante:

eternagame.wikia.com/wiki/EteRNA_Dictionary

J'obtiens 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 j'ai réalisé que c'est parce que node.js ne peut pas trouver le serveur à partir du DNS (je pense). Cependant, je ne sais pas pourquoi cela serait, car mon code fonctionne parfaitement www.google.com.

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

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.



a dû utiliser var http = require("http");ou var https = require("https");basé sur un hôte distant
— prayagupd

qu'est-ce que cela ENOTFOUND signifie?
— Charlie Parker

Réponses:


280

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

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

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

Mettre à jour

Comme indiqué dans le commentaire de @EnchanterIO, le portchamp est également une option distincte; et le protocole http://ne doit pas être inclus sur le hostterrain. D'autres réponses recommandent également l'utilisation du httpsmodule si SSL est requis.


16
Merci pour la réponse rapide, cela fonctionne parfaitement! J'ai envie de voter contre ma propre question pour ne pas avoir lu les documents en premier.
— Vineet Kosaraju

2
Mon problème était que dans mon script nodejs, je faisais une demande à la mauvaise URL et cette erreur a été levée.
— Michael J.Calkins

49
Donc, pour résumer: 1. Incluez uniquement le nom d'hôte réel dans host, donc non http://ou https://; et 2. N'incluez pas le chemin dans la hostpropriété, mais plutôt dans la pathpropriété.
— Eduard Luca

1
Mon exemple de code dans Learning Node ne m'a pas permis de comprendre cela. Maintenant, je comprends pourquoi j'ai eu d'étranges échecs quand j'ai rempli le options {...}bloc.
— Michael Shopsin

+ assurez-vous que le port est également dans un attribut d'option distinct de l'hôte.
— Lukas Lukac

240

Une autre source d'erreur courante pour

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

écrit le protocole (https, https, ...) lors de la définition de la hostpropriété dansoptions

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

7
Il s'agit d'une erreur plus générale que celle discutée.
— shaunakde

5
Merci d'avoir posté cette solution alternative, je me heurtais à cela exactement.
— Ryan

Merci @Jorge, j'utilise http.request (), ce qui a généré l'erreur de la même manière que j'allais utiliser http.get (), mais je viens de supprimer http: // avec http.request () et de travailler.
— Shashikant Pandit

17

dans les options de la requête HTTP, basculez-la sur

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

Je pense que cela résoudra votre problème.


1
Merci d'avoir répondu! Cela fonctionne également parfaitement, mais j'ai marqué l'autre comme correct car il a un lien vers les documents et deux options.
— Vineet Kosaraju

12
  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);
        });

  });

Merci d'avoir répondu! Tout comme la réponse de Russbear, celle-ci fonctionne parfaitement, mais j'ai marqué que yuxhuang était correct car il donnait à la fois des options et un lien vers les documents.
— Vineet Kosaraju

1
Juste coder sans expliquer quel est le problème et ce que la solution n'est pas vraiment une réponse complète, je ne vois pas ce que vous avez fait dans votre bloc de code, merci.
— Al-Mothafar

11

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


7

Je pense que http fait une requête sur le port 80, même si j'ai mentionné l'URL complète de l'hôte dans l'objet options. Lorsque j'ai exécuté l'application serveur qui a l'API, sur le port 80, que j'exécutais précédemment sur le port 3000, cela a fonctionné. 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();

la partie importante de cette réponse est le protocole. nodejs http ne prend pas en charge l'URI complet avec host: https://server.com, ce qui est également mentionné ici stackoverflow.com/a/28385129/432903
— prieragupd

3

Notez que ce problème peut également se produire si le domaine auquel vous faites référence tombe en panne (par exemple, n'existe plus.)


3

J'ai corrigé cette erreur avec ceci

$ 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 d'origine: https://github.com/npm/npm/issues/6686



1

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


Merci pour le lien vers le module, mais j'espérais le faire avec la bibliothèque node.js standard, en utilisant http.get ().
— Vineet Kosaraju

0

J'ai eu cette erreur en passant de l'environnement de développement à l'environnement de production. J'étais obsédé par la mise https://en place de tous les liens. Ce n'est pas nécessaire, donc cela peut être une solution pour certains.


0

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


0

Si vous êtes toujours confronté à la vérification du paramètre de proxy, pour moi, c'était le paramètre de proxy qui manquait et n'a pas pu faire la demande car les http / https directs sont bloqués. J'ai donc configuré le proxy de mon organisation 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

J'ai résolu ce problème en supprimant les caractères indésirables du mot de passe pour la connexion. Par exemple, j'avais ces caractères: <##% et cela a causé le problème (très probablement la balise de hachage était la cause première du problème).


0

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 aussi pour vous.


0

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 un nom de domaine donc j'ai dû 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;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.