Node.js getaddrinfo ENOTFOUND

Als je Node.js gebruikt om te proberen de html-inhoud van de volgende webpagina te krijgen:

eternagame.wikia.com/wiki/EteRNA_Dictionary

Ik krijg de volgende foutmelding:

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)

Ik heb deze fout al opgezocht op stackoverflow en realiseerde me dat dit komt omdat node.js de server niet kan vinden via DNS (denk ik). Ik weet echter niet zeker waarom dit zou zijn, aangezien mijn code perfect werkt op www.google.com.

Hier is mijn code (praktisch gekopieerd en geplakt van een zeer vergelijkbare vraag, behalve met de host gewijzigd):

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

Hier is de bron waaruit ik heb gekopieerd en geplakt: Hoe webservice bellen in Expressjs?

Ik gebruik geen modules met node.js.

Bedankt voor het lezen.


Antwoord 1, autoriteit 100%

In Node.js HTTP documentatie van de module: http://nodejs.org/api/http.html#http_http_request_options_callback

U kunt ofwel http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback) aanroepen, de URL wordt vervolgens geparseerd met url.parse(); of bel http.get(options, callback), waar options is

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

Bijwerken

Zoals vermeld in de opmerking van @EnchanterIO, is het veld port ook een aparte optie; en het protocol http:// mag niet worden opgenomen in het veld host. Andere antwoorden raden ook het gebruik van de https-module aan als SSL vereist is.


Antwoord 2, autoriteit 77%

Een andere veelvoorkomende foutbron voor

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

is het protocol (https, https, …) aan het schrijven bij het instellen van de eigenschap host in options

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

Antwoord 3, autoriteit 6%

schakel het in de opties voor het HTTP-verzoek om naar

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

Ik denk dat dit je probleem zal oplossen.


Antwoord 4, autoriteit 3%

Als je https moet gebruiken, gebruik dan de https-bibliotheek

https = require('https');
// options
var options = {
    host: 'eternagame.wikia.com',
    path: '/wiki/EteRNA_Dictionary'
}
// get
https.get(options, callback);

Antwoord 5, autoriteit 3%

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

Antwoord 6, autoriteit 3%

Mijn probleem was dat mijn OS X (Mavericks) DNS-service opnieuw moest worden opgestart. Op Catalina en Big Sur kan de DNS-cache worden gewist met:

sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

Oudere macOS-versies zie hier.


Antwoord 7, autoriteit 2%

Ik denk dat http een verzoek doet op poort 80, ook al heb ik de volledige host-url genoemd in het options-object. Toen ik de servertoepassing met de API uitvoerde op poort 80, die ik eerder op poort 3000 draaide, werkte het. Merk op dat om een ​​applicatie op poort 80 te draaien, je root-rechten nodig hebt.

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

Hier is een compleet codefragment

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

Antwoord 8

Houd er rekening mee dat dit probleem ook kan optreden als het domein waarnaar u verwijst uitvalt (bijv. bestaat niet meer.)


Antwoord 9

Ik heb deze fout hiermee verholpen

$ 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!

Oorspronkelijke bron: https://github.com/npm/npm/issues/6686


Antwoord 10

Ik heb het geprobeerd met behulp van de verzoekmodule en kon de hoofdtekst van die pagina mooi afdrukken gemakkelijk. Helaas kan ik met de vaardigheden die ik heb niet anders helpen.


Antwoord 11

Ik kreeg dezelfde foutmelding en gebruikte onderstaande link om hulp te krijgen:

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

Ik had niet in mijn code:

req.end();

(NodeJs V: 5.4.0)
eenmaal toegevoegd boven de regel req.end();, kon ik de fout verwijderen en werkte het prima voor mij.


Antwoord 12

Ik kreeg deze foutmelding toen ik van ontwikkelomgeving naar productieomgeving ging. Ik was geobsedeerd door het plaatsen van https:// op alle links. Dit is niet nodig, dus het kan voor sommigen een oplossing zijn.


Antwoord 13

Ik heb http en extra slash(/) verwijderd.
Ik heb zojuist deze ‘node-test.herokuapp.com’ gebruikt en het werkte.


Antwoord 14

Als je nog steeds geconfronteerd wordt met afrekenen voor de proxy-instelling, was het voor mij de proxy-instelling die ontbrak en ik kon het verzoek niet indienen omdat directe http/https zijn geblokkeerd. Dus ik heb de proxy van mijn organisatie geconfigureerd terwijl ik het verzoek deed.

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

Antwoord 15

Ik heb dit probleem opgelost door ongewenste tekens uit het wachtwoord voor de verbinding te verwijderen. Ik had bijvoorbeeld deze tekens: <##% en het veroorzaakte het probleem (waarschijnlijk was de hashtag de hoofdoorzaak van het probleem).


Antwoord 16

Probeer het IP-adres van de server te gebruiken in plaats van de hostnaam.
Dit werkte voor mij. Ik hoop dat het ook voor jou zal werken.


Antwoord 17

Mijn probleem was dat we de URL aan het ontleden waren en http_options voor http.request() aan het genereren waren;

Ik gebruikte request_url.host die al een poortnummer met domeinnaam had, dus ik moest request_url.hostname gebruiken.

var request_url = new URL('https://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;

Antwoord 18

in mijn geval was de fout het gevolg van het gebruik van een onjuiste hostwaarde
was

  var options = {
    host: 'graph.facebook.com/v2.12/',
    path: path
  }

zou moeten zijn

  var options = {
    host: 'graph.facebook.com',
    path: path
  }

dus alles na .com of .net etc moet worden verplaatst naar padparameterwaarde

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes