Node.js getaddrinfo ENOTFOUND


265

Saat menggunakan Node.js untuk mencoba dan mendapatkan konten html dari halaman web berikut:

eternagame.wikia.com/wiki/EteRNA_Dictionary

Saya mendapatkan kesalahan berikut:

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)

Saya sudah melihat kesalahan ini pada stackoverflow, dan menyadari bahwa ini karena node.js tidak dapat menemukan server dari DNS (saya pikir). Namun, saya tidak yakin mengapa ini terjadi, karena kode saya berfungsi dengan baik www.google.com.

Ini kode saya (praktis disalin dan ditempel dari pertanyaan yang sangat mirip, kecuali dengan host yang diubah):

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

Berikut adalah sumber tempat saya menyalin dan menempel: Bagaimana cara membuat panggilan layanan web di Expressjs?

Saya tidak menggunakan modul apa pun dengan node.js.

Terima kasih sudah membaca.



harus menggunakan var http = require("http");atau var https = require("https");berdasarkan host jarak jauh
prayagupd

apa ENOTFOUND artinya
Charlie Parker

Jawaban:


280

Dalam dokumentasi modul Node.js HTTP : http://nodejs.org/api/http.html#http_http_request_options_callback

Anda dapat memanggil http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback), URL kemudian diuraikan dengan url.parse(); atau telepon http.get(options, callback), di mana optionsada

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

Memperbarui

Sebagaimana dinyatakan dalam komentar oleh @EnchanterIO, portbidang ini juga merupakan opsi terpisah; dan protokol http://tidak boleh dimasukkan dalam hostbidang. Jawaban lain juga merekomendasikan penggunaan httpsmodul jika SSL diperlukan.


16
Terima kasih atas balasan cepatnya, ini bekerja dengan sempurna! Saya ingin membatalkan pertanyaan saya sendiri karena tidak membaca dokumen terlebih dahulu.
Vineet Kosaraju

2
Masalah saya adalah bahwa dalam skrip nodejs saya, saya membuat permintaan ke url yang salah dan kesalahan ini dilemparkan.
Michael J. Calkins

49
Jadi pada dasarnya, untuk meringkasnya: 1. Hanya menyertakan nama host yang sebenarnya host, jadi tidak http://atau https://; dan 2. Jangan mencantumkan jalur di hostproperti, melainkan di pathproperti.
Eduard Luca

1
Kode sampel saya di Learning Node tidak menjelaskan hal ini kepada saya. Sekarang saya mengerti mengapa saya mengalami kegagalan aneh ketika saya mengisi options {...}blok.
Michael Shopsin

+ pastikan port juga dalam atribut opsi yang terpisah dari host.
Lukas Lukac

240

Sumber kesalahan umum lainnya untuk

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

sedang menulis protokol (https, https, ...) saat mengatur hostproperti dioptions

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

7
Ini adalah kesalahan yang lebih umum daripada yang dibahas.
shaunakde

5
Terima kasih telah memposting solusi alternatif ini, saya benar-benar mengalami hal ini.
Ryan

Terima kasih @Jorge saya menggunakan http.request () yang dilemparkan kesalahan yang sama saya akan menggunakan http.get () tetapi saya baru saja menghapus http: // dengan http.request () dan berfungsi.
Shashikant Pandit

17

dalam opsi untuk permintaan HTTP, alihkan ke

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

Saya pikir itu akan memperbaiki masalah Anda.


1
Terima kasih atas jawabannya! Ini juga berfungsi dengan baik, tetapi saya menandai yang lain sebagai benar karena memiliki tautan ke dokumen dan dua opsi.
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);
        });

  });

Terima kasih atas jawabannya! Sama seperti jawaban Russbear, yang ini berfungsi dengan baik tetapi saya menandai yuxhuang benar karena dia memberikan kedua opsi dan tautan ke dokumen.
Vineet Kosaraju

1
Hanya kode tanpa menjelaskan apa masalahnya dan apa solusinya bukan jawaban yang lengkap, saya tidak melihat apa yang Anda lakukan di blok kode Anda, terima kasih.
Al-Mothafar

11

Jika Anda perlu menggunakan https, maka gunakan perpustakaan https

https = require('https');

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

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


7

Saya pikir http membuat permintaan pada port 80, meskipun saya menyebutkan url host lengkap di objek pilihan. Ketika saya menjalankan aplikasi server yang memiliki API, pada port 80, yang saya jalankan sebelumnya pada port 3000, itu berhasil. Perhatikan bahwa untuk menjalankan aplikasi pada port 80 Anda perlu root privilege.

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

Berikut ini cuplikan kode lengkap

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

bagian penting dalam jawaban ini adalah protokol. nodejs http tidak mendukung uri penuh dengan host: https://server.com, yang disebutkan di sini juga stackoverflow.com/a/28385129/432903
prayagupd

3

Perhatikan bahwa masalah ini juga dapat terjadi jika domain yang Anda referensikan turun (misalnya, tidak ada lagi.)


3

Saya memperbaiki kesalahan ini dengan ini

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

Sumber asli: https://github.com/npm/npm/issues/6686



1

Saya mencobanya menggunakan modul permintaan , dan mampu mencetak isi halaman itu dengan cukup mudah. Sayangnya dengan keterampilan yang saya miliki, saya tidak dapat membantu selain itu.


Terima kasih atas tautannya ke modul, tapi saya berharap bisa melakukan ini dengan pustaka node.js standar, menggunakan http.get ().
Vineet Kosaraju

0

Saya mendapatkan kesalahan ini ketika berpindah dari lingkungan pengembangan ke lingkungan produksi. Saya terobsesi dengan menaruh https://semua tautan. Ini tidak perlu, jadi itu mungkin solusi bagi sebagian orang.


0

Saya menyingkirkan http dan slash tambahan (/). Saya hanya menggunakan 'node-test.herokuapp.com' ini dan berhasil.


0

Jika masih Anda menghadapi checkout untuk pengaturan proxy, bagi saya itu adalah pengaturan proxy yang hilang dan tidak dapat membuat permintaan karena http / https langsung diblokir. Jadi saya mengkonfigurasi proxy dari organisasi saya saat mengajukan permintaan.

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

Saya mengatasi masalah ini dengan menghapus karakter yang tidak diinginkan dari kata sandi untuk koneksi. Sebagai contoh, saya memiliki karakter-karakter ini: <##% dan itu menyebabkan masalah (kemungkinan tag hash adalah penyebab utama dari masalah).


0

Coba gunakan alamat IP server daripada nama host. Ini berhasil untuk saya. Semoga ini akan bekerja untuk Anda juga.


0

Masalah saya adalah kami mengurai url dan menghasilkan http_options untuk http.request ();

Saya menggunakan request_url.host yang sudah memiliki nomor port dengan nama domain jadi harus menggunakan 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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.