Node.js getaddrinfo ENOTFOUND


265

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á procurei esse erro no stackoverflow e percebi que isso ocorre porque o node.js não consegue encontrar o servidor pelo DNS (acho). No entanto, não sei por que isso seria, pois meu código funciona perfeitamente www.google.com.

Aqui está o meu código (praticamente copiado e colado de uma pergunta 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 de onde eu 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.



teve que usar var http = require("http");ou var https = require("https");baseado em host remoto
prayagupd

o que ENOTFOUND significa
Charlie Parker

Respostas:


280

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

Você pode ligar http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback), o URL é analisado com url.parse(); ou ligue http.get(options, callback), onde optionsestá

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

Atualizar

Conforme declarado no comentário de @EnchanterIO, o portcampo também é uma opção separada; e o protocolo http://não deve ser incluído no hostcampo. Outras respostas também recomendam o uso do httpsmódulo se o SSL for necessário.


16
Obrigado pela resposta rápida, isso funciona perfeitamente! Sinto vontade de votar minha própria pergunta por não ler os documentos primeiro.
Vineet Kosaraju

2
Meu problema foi que, no script nodejs, eu estava solicitando o URL errado e esse erro foi gerado.
Michael J. Calkins

49
Então, basicamente, para resumir: 1. Inclua apenas o nome do host real em host, então no http://ou https://; e 2. Não inclua o caminho na hostpropriedade, mas sim na pathpropriedade.
Eduard Luca #

1
Meu código de exemplo no Learning Node não deixou isso claro para mim. Agora entendo por que recebi falhas estranhas quando preenchi o options {...}bloco.
Michael Shopsin

+ verifique se a porta também está em um atributo de opção separado do host.
Lukas Lukac

240

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 hostpropriedade emoptions

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

7
Este é um erro mais geral do que o discutido.
Shaunakde

5
Obrigado por postar esta solução alternativa, eu estava encontrando exatamente isso.
Ryan

Obrigado @Jorge, estou usando http.request (), que lançou o mesmo erro que eu usaria http.get (), mas acabei de remover http: // com http.request () e funcionou.
Shashikant Pandit

17

nas opções da solicitação HTTP, alterne para

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

Eu acho que isso vai resolver o seu problema.


1
Obrigado pela resposta! Isso também funciona perfeitamente, mas marquei o outro como correto, pois possui um link para os documentos e duas opções.
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);
        });

  });

Obrigado pela resposta! Assim como a resposta de Russbear, esta funciona perfeitamente, mas eu marquei Yuxhuang como correta, porque ele deu as opções e um link para os documentos.
Vineet Kosaraju

1
Apenas codifique sem explicar qual é o problema e a solução não é realmente uma resposta completa. Não vejo o que você fez no seu bloco de código, obrigado.
Al-Mothafar

11

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


7

Acho que o http faz a solicitação na porta 80, mesmo que eu tenha mencionado a URL completa do host no objeto options. Quando executo o aplicativo de servidor que possui a API, na porta 80, que eu estava executando anteriormente na porta 3000, ele funcionou. Observe que, para executar um aplicativo na porta 80, você precisará de privilégios 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();

a parte importante nesta resposta é protocolo. nodejs http não apoiar uri completa com host: https://server.com, que é mencionado aqui também stackoverflow.com/a/28385129/432903
prayagupd

3

Observe que esse problema também pode ocorrer se o domínio que você está referenciando ficar inativo (por exemplo, não existe mais).


3

Corrigi este erro com este

$ 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



1

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


Obrigado pelo link para o módulo, mas eu esperava fazer isso com a biblioteca node.js padrão, usando http.get ().
Vineet Kosaraju

0

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


0

Eu me livrei do http e da barra extra (/). Acabei de usar este 'node-test.herokuapp.com' e funcionou.


0

Se você ainda está enfrentando o checkout para a configuração de proxy, para mim foi a configuração de proxy que estava ausente e não foi possível fazer a solicitação, pois o http / https direto está bloqueado. Então, eu configurei o proxy da minha organização ao fazer 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
};

0

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 tag hash foi a causa raiz do problema).


0

Tente usar o endereço IP do servidor em vez do nome do host. Isso funcionou para mim. Espero que funcione para você também.


0

Meu problema era que estávamos analisando o URL e gerando http_options para http.request ();

Eu estava usando request_url.host que já tinha o número da porta com nome de domínio, então tive que usar 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;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.