Wanneer u Node.js te proberen en krijgen de html inhoud van de volgende webpagina:
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 opgezet op Stackoverflow en besefte dat dit komt omdat Node.js de server niet van DNS (denk ik denk). Ik ben echter niet zeker waarom dit zou zijn, omdat 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 waar ik kopieerden en geplakt: hoe Maak webservice-oproepen in Expressjs?
Ik gebruik geen modules met Node.Js.
Bedankt voor het lezen.
Antwoord 1, autoriteit 100%
In Node.jsHTTP
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
Merk op dat dit probleem ook kan optreden als het domein dat u verwijst naar beneden (bijv. Niet langer bestaat.)
Antwoord 9
Ik heb deze fout met dit vastgesteld
$ 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!
Originele bron: https://github.com/npm/npm/issues/6686
Antwoord 10
Ik heb het geprobeerd met behulp van de verzoekmoduleen 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