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
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.
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'
};
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.
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);
});
});
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);
Mon problème était que mon service DNS OS X (Mavericks) devait être redémarré .
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();
Notez que ce problème peut également se produire si le domaine que vous référencez tombe en panne (EG. N'existe plus.)
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
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é.
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.
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.
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.
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
};
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).
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;
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é.