Node.js getaddrinfo ENOTFOUND


265

Aşağıdaki web sayfasının html içeriğini denemek ve almak için Node.js'yi kullanırken:

eternagame.wikia.com/wiki/EteRNA_Dictionary

Aşağıdaki hatayı alıyorum:

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)

Stackoverflow zaten bu hatayı aradım ve bunun nedeni node.js DNS sunucu bulamıyor çünkü (fark). Ancak, benim kod mükemmel çalışır gibi bu neden olur emin değilim www.google.com.

İşte benim kod (neredeyse değişti ve çok benzer bir sorudan yapıştırılan, ana bilgisayar değişti hariç):

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

Kopyaladığım ve yapıştırdığım kaynak: Expressjs'de web hizmeti çağrıları nasıl yapılır?

Node.js ile herhangi bir modül kullanmıyorum.

Okuduğunuz için teşekkürler.



kullanmak zorundaydı var http = require("http");ya davar https = require("https"); uzak ana bilgisayara bağlı
prayagupd

ne ENOTFOUND demek
Charlie Parker

Yanıtlar:


280

In node.js HTTP modülün belgelerine: http://nodejs.org/api/http.html#http_http_request_options_callback

Arayabilirsiniz http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback), URL daha sonra ile ayrıştırılır url.parse(); veya arama http.get(options, callback), nerede optionsolduğunu

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

Güncelleme

@EnchanterIO tarafından yapılan yorumda belirtildiği gibi, portalan da ayrı bir seçenektir; ve protokol alana http://dahil edilmemelidir host. Diğer cevaplar ayrıcahttpsSSL gerekiyorsa modülün .


16
Hızlı cevap için teşekkürler, bu mükemmel çalışıyor! Önce dokümanı okumadığım için kendi sorumu küçümsemek istiyorum.
Vineet Kosaraju

2
Benim sorunum benim nodejs komut dosyası içinde yanlış url için bir istekte bulunuyordu ve bu hata atıldı oldu.
Michael J. Calkins

49
Özetle, özetlemek gerekirse: 1. Sadece gerçek ana bilgisayar adını içine ekleyin host, bu yüzden hayır http://veya https://; ve 2. Yolu hostmülke değil, pathmülke dahil edin.
Eduard Luca

1
Öğrenme Düğümü'ndeki örnek kodum bunu açıkça ortaya koymadı. Şimdi options {...}bloğu doldurduğumda neden garip hatalar yaşadığımı anlıyorum .
Michael Shopsin

+ bağlantı noktasının ana bilgisayardan ayrı bir seçenek özelliğinde olduğundan emin olun.
Lukas Lukac

240

İçin başka bir yaygın hata kaynağı

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

özelliği ayarlarken protokolü (https, https, ...) yazıyorhostoptions

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

7
Bu, tartışılandan daha genel bir hatadır.
shaunakde

5
Bu alternatif çözümü paylaştığınız için teşekkür ederim, tam olarak bununla karşılaşmıştım.
Ryan

Teşekkürler @Jorge ben aynı atılan http.request () kullanıyorum http.get () kullanacaktı ama ben sadece http: // http.request () ile kaldırıldı ve çalıştı.
Shashikant Pandit

17

HTTP isteği seçeneklerinde,

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

Bence bu senin problemini çözecek.


1
Cevap için teşekkürler! Bu da mükemmel çalışıyor, ancak diğerine doğru olarak işaretledim çünkü dokümanlar ve iki seçenek için bir bağlantısı var.
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);
        });

  });

Cevap için teşekkürler! Tıpkı Russbear'ın yanıtı gibi, bu mükemmel çalışıyor ama yuxhuang'ın doğru olduğunu işaretledim çünkü hem seçenekleri hem de dokümanlara bir bağlantı verdi.
Vineet Kosaraju

1
Sorunun ne olduğunu ve çözümün gerçekten tam bir cevap olmadığını açıklamaksızın kodlayın, kod bloğunuzda ne yaptığınızı görmüyorum, teşekkürler.
Al-Mothafar

11

Https kullanmanız gerekiyorsa, https kitaplığını kullanın

https = require('https');

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

// get
https.get(options, callback);


7

Seçenek nesnesinde tam ana bilgisayar url'sinden bahsetmiş olmama rağmen http, bağlantı noktası 80'de istekte bulunduğunu düşünüyorum. API olan sunucu uygulamasını çalıştırdığımda, daha önce 3000 numaralı bağlantı noktasında çalıştığım 80 numaralı bağlantı noktasında işe yaradı. 80 numaralı bağlantı noktasında bir uygulama çalıştırmak için root ayrıcalığına ihtiyacınız olduğunu unutmayın.

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

İşte tam bir kod snippet'i

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

bu cevabın önemli kısmı protokoldür. nodejs http host: https://server.com, burada da belirtildiği gibi tam uri'yi desteklemedi stackoverflow.com/a/28385129/432903
prayagupd

3

Bu sorun, başvurduğunuz etki alanı bozulursa da oluşabilir (EG. Artık mevcut değildir.)


3

Bu hatayı bununla düzelttim

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

Orijinal kaynak: https://github.com/npm/npm/issues/6686



1

İstek modülünü kullanarak denedim ve bu sayfanın gövdesini kolayca yazdırabildim. Ne yazık ki sahip olduğum becerilerle bundan başka yardım edemem.


Modüle bağlantı için teşekkürler, ama bunu http.get () kullanarak standart node.js kütüphanesi ile yapmayı umuyordum.
Vineet Kosaraju

0

Geliştirme ortamından üretim ortamına geçerken bu hatayı aldım. https://Tüm bağlantıları takmaya takıntılıydım . Bu gerekli değildir, bu yüzden bazıları için bir çözüm olabilir.


0

Http ve ekstra eğik çizgiden (/) kurtuldum. Bu 'node-test.herokuapp.com'u kullandım ve işe yaradı.


0

Hala proxy ayarı için ödeme ile karşı karşıyaysanız, benim için eksik olan ve doğrudan http / https engellendiği için istek yapamayan proxy ayarı oldu. Yani istek yaparken kuruluşumdan proxy yapılandırılmış.

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

Bağlantı için parola istenmeyen karakterleri kaldırarak bu sorunu çözdüm. Örneğin, şu karakterleri vardı: <##% ve soruna neden oldu (büyük olasılıkla karma etiketi sorunun kök nedeniydi).


0

Ana bilgisayar adı yerine sunucu IP adresini kullanmayı deneyin. Bu benim için çalıştı. Umarım sizin için de çalışır.


0

Benim sorunum, url ayrıştırmak ve http.request () için http_options oluşturmak oldu;

Alan adı ile bağlantı noktası numarası zaten request_url.hostname kullanmak zorunda request_url.host kullanıyordum.

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.