Node.js getaddrinfo ENOTFOUND

Ao usar o Node.js para tentar obter o conteúdo html da seguinte página da web:

eternagame.wikia.com/wiki/EteRNA_Dictionary

Estou tendo o erro a seguir:

 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) 

Eu já pesquisei esse erro no stackoverflow, e percebi que isso é porque node.js não consegue encontrar o servidor do DNS (eu acho). No entanto, não sei por que isso aconteceria, pois meu código funciona perfeitamente em www.google.com .

Aqui está o meu código (praticamente copiado e colado de uma questão muito semelhante, exceto com o host alterado):

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

Aqui está a fonte da qual copiei e colei: Como fazer chamadas de serviço da web no Expressjs?

Eu não estou usando nenhum módulo com node.js.

Obrigado pela leitura,

Vineet

Na documentação do módulo HTTP Node.js : http://nodejs.org/api/http.html#http_http_request_options_callback

Você pode chamar http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback) , o URL é então analisado com url.parse() ; ou chame http.get(options, callback) , onde as options são

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

Atualizar

Como afirmado no comentário de @EnchanterIO, o campo de port também é uma opção separada; e o protocolo http:// não deve ser incluído no campo do host . Outras respostas também recomendam o uso do módulo https se o SSL for necessário.

Outra fonte comum de erro para

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

está escrevendo o protocolo (https, https, …) ao definir a propriedade do host em options

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

nas opções para o pedido HTTP, mude para

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

Eu acho que isso vai resolver o seu problema.

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

Se você precisar usar https, use a biblioteca https

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

Meu problema era que meu serviço DNS do OS X (Mavericks) precisava ser reinicializado .

Observe que esse problema também pode ocorrer se o domínio ao qual você está fazendo referência estiver inativo (por exemplo, não existe mais).

Eu acho que http faz pedido na porta 80, mesmo que eu tenha mencionado a URL completa do host no object options. Quando eu executo o aplicativo do servidor que tem a API, na porta 80, que eu estava executando anteriormente na porta 3000, funcionou. Observe que, para executar um aplicativo na porta 80, você precisará do privilégio de root.

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

Aqui está um trecho de código completo

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

Eu estava recebendo o mesmo erro e usei o link abaixo para obter ajuda:

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

Eu não estava tendo no meu código:

req.end();

(NodeJs V: 5.4.0) uma vez adicionado acima req.end(); linha, eu era capaz de se livrar do erro e funcionou bem para mim.

Eu consertei esse erro com isso

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

Fonte original: https://github.com/npm/npm/issues/6686

Eu tentei usando o módulo de solicitação e consegui imprimir o corpo dessa página facilmente. Infelizmente, com as habilidades que tenho, não posso ajudar além disso.

Eu recebi esse erro ao passar do ambiente de desenvolvimento para o ambiente de produção. Eu estava obcecado em colocar https:// em todos os links. Isso não é necessário, por isso pode ser uma solução para alguns.

Eu me livrei de http e barra extra (/). Eu usei esse ‘node-test.herokuapp.com’ e funcionou.

Se você ainda está enfrentando checkout para configuração de proxy, para mim foi a configuração de proxy que estava faltando e não foi capaz de fazer a solicitação como http / https direto está bloqueado. Então eu configurei o proxy da minha organização enquanto fazia a solicitação.

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

Eu resolvi esse problema removendo caracteres não desejáveis ​​da senha da conexão. Por exemplo, eu tinha esses caracteres: <##% e isso causou o problema (provavelmente a hashtag era a causa raiz do problema).

A solução para esse erro para mim foi instalar o http com o gerenciador de pacotes do nó:

 npm install http-server -g