Node.js getaddrinfo ENOTFOUND


265

निम्न वेब पेज की HTML सामग्री को आज़माने और प्राप्त करने के लिए Node.js का उपयोग करते समय:

eternagame.wikia.com/wiki/EteRNA_Dictionary

मुझे निम्नलिखित त्रुटि मिलती है:

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)

मैंने स्टैकओवरफ़्लो पर इस त्रुटि को पहले ही देख लिया था, और महसूस किया कि ऐसा इसलिए है क्योंकि नोड.जेएस को DNS से ​​सर्वर नहीं मिल सकता है (मुझे लगता है)। हालाँकि, मुझे यकीन नहीं है कि ऐसा क्यों होगा, क्योंकि मेरा कोड पूरी तरह से काम करता है www.google.com

यहाँ मेरा कोड (व्यावहारिक रूप से कॉपी किया गया है और बहुत ही समान प्रश्न से चिपकाया गया है, मेजबान को छोड़कर)

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

यहाँ वह स्रोत है जहाँ से मैंने कॉपी और पेस्ट किया है: एक्सप्रेसजेज में वेब सेवा कॉल कैसे करें?

मैं नोड.जेएस के साथ किसी भी मॉड्यूल का उपयोग नहीं कर रहा हूं

पढ़ने के लिए धन्यवाद।



दूरदराज के मेजबान पर आधारित var http = require("http");या उपयोग करना पड़ाvar https = require("https");
प्रयागपाद

क्या ENOTFOUND मतलब है?
चार्ली पार्कर

जवाबों:


280

में Node.js HTTP मॉड्यूल के प्रलेखन: http://nodejs.org/api/http.html#http_http_request_options_callback

आप या तो कॉल कर सकते हैं http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback), फिर URL के साथ पार्स किया गया है url.parse(); या कॉल http.get(options, callback), कहाँ optionsहै

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

अपडेट करें

जैसा कि @EnchanterIO द्वारा टिप्पणी में कहा गया है, portक्षेत्र भी एक अलग विकल्प है; और प्रोटोकॉल http://को hostक्षेत्र में शामिल नहीं किया जाना चाहिए । httpsSSL की आवश्यकता होने पर अन्य उत्तर भी मॉड्यूल के उपयोग की सलाह देते हैं ।


16
त्वरित उत्तर के लिए धन्यवाद, यह पूरी तरह से काम करता है! मुझे लगता है कि पहले डॉक्स नहीं पढ़ने के लिए अपने ही सवाल को नीचा दिखाना।
विनीत कोसाराजू जू

2
मेरा मुद्दा यह था कि मेरे नोडज स्क्रिप्ट के भीतर मैं गलत यूआरएल के लिए एक अनुरोध कर रहा था और यह त्रुटि थी।
माइकल जे। कैलकिंस

49
तो मूल रूप से, इसे योग करने के लिए: 1. केवल वास्तविक होस्टनाम में शामिल करें host, इसलिए नहीं http://या https://; और 2. hostसंपत्ति में पथ शामिल न करें , बल्कि pathसंपत्ति में।
एडुआर्ड लुका

1
लर्निंग नोड में मेरे सैंपल कोड ने मुझे यह स्पष्ट नहीं किया। अब मुझे समझ में आया कि जब मैंने options {...}ब्लॉक भरा तो मुझे अजीब सी असफलताएँ मिलीं ।
माइकल शोप्सिन

+ सुनिश्चित करें कि होस्ट से पोर्ट एक अलग विकल्प विशेषता में भी है।
लुकास लुकाक

240

त्रुटि का एक और सामान्य स्रोत है

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

संपत्ति सेट करते समय प्रोटोकॉल (https, https, ...) लिख रहा hostहैoptions

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

7
यह चर्चा की गई की तुलना में अधिक सामान्य त्रुटि है।
शौनकादे

5
इस वैकल्पिक समाधान को पोस्ट करने के लिए धन्यवाद, मैं बिल्कुल इसमें भाग रहा था।
रयान

धन्यवाद @ जोर्ज मैं http.request () का उपयोग कर रहा हूं, जिसने त्रुटि को वही फेंक दिया जो मैं http.get () का उपयोग करने जा रहा था, लेकिन मैंने http.request () के साथ http: // को हटा दिया और काम किया।
शशिकांत पंडित

17

HTTP अनुरोध के विकल्पों में, इसे स्विच करें

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

मुझे लगता है कि मैं आपकी समस्या ठीक कर दूंगा।


1
जवाब के लिए धन्यवाद! यह भी पूरी तरह से काम करता है, लेकिन मैंने दूसरे को सही के रूप में चिह्नित किया है क्योंकि इसमें डॉक्स और दो विकल्पों का लिंक है।
विनीत कोसाराजू जू

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

  });

जवाब के लिए धन्यवाद! रस्बीयर के जवाब की तरह, यह पूरी तरह से काम करता है लेकिन मैंने यक्सहुआंग के सही को चिह्नित किया क्योंकि उसने दोनों विकल्प और डॉक्स का लिंक दिया था।
विनीत कोसाराजू जू

1
बस यह बताए बिना कि क्या समस्या है और क्या समाधान वास्तव में एक पूर्ण उत्तर नहीं है, मैं नहीं देखता कि आपने कोड के अपने ब्लॉक में क्या किया, धन्यवाद।
अल-मोताफ़र

11

यदि आपको https का उपयोग करने की आवश्यकता है, तो https लाइब्रेरी का उपयोग करें

https = require('https');

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

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

8

मेरी समस्या यह थी कि मेरे OS X (Mavericks) DNS सेवा को रिबूट करने की आवश्यकता थी ।


7

मुझे लगता है कि http पोर्ट 80 पर अनुरोध करता है, भले ही मैंने विकल्प ऑब्जेक्ट में पूर्ण होस्ट यूआरएल का उल्लेख किया हो। जब मैं सर्वर एप्लिकेशन को चलाता हूं जिसमें पोर्ट 80 पर एपीआई है, जिसे मैं पहले पोर्ट 3000 पर चला रहा था, तो यह काम किया। ध्यान दें कि पोर्ट 80 पर एप्लिकेशन चलाने के लिए आपको रूट विशेषाधिकार की आवश्यकता होगी।

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

यहाँ एक पूर्ण कोड स्निपेट है

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

इस उत्तर में महत्वपूर्ण हिस्सा प्रोटोकॉल है। NodeJS http के साथ पूर्ण uri का समर्थन नहीं किया host: https://server.comहै, जो साथ ही यहां बताया गया है stackoverflow.com/a/28385129/432903
prayagupd

3

ध्यान दें कि यह समस्या तब भी हो सकती है यदि आप जिस डोमेन को संदर्भित कर रहे हैं वह नीचे चला जाता है (जैसे अब मौजूद नहीं है।)


3

मैंने इसके साथ यह त्रुटि ठीक की

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

मूल स्रोत: https://github.com/npm/npm/issues/6686


2

मुझे वही त्रुटि मिल रही थी और मदद पाने के लिए नीचे दिए गए लिंक का उपयोग किया गया था:

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

मैं अपने कोड में नहीं था:

req.end();

(NodeJs V: 5.4.0) एक बार ऊपर req.end();लाइन में जोड़ा गया, मैं त्रुटि से छुटकारा पाने में सक्षम था और मेरे लिए ठीक काम किया।


1

मैंने इसे अनुरोध मॉड्यूल का उपयोग करने की कोशिश की , और उस पृष्ठ के शरीर को बहुत आसानी से प्रिंट करने में सक्षम था। दुर्भाग्य से मेरे पास जो कौशल है, मैं उसके अलावा अन्य मदद नहीं कर सकता।


मॉड्यूल के लिंक के लिए धन्यवाद, लेकिन मैं http.get () का उपयोग करते हुए मानक नोड.जेएस लाइब्रेरी के साथ ऐसा करने की उम्मीद कर रहा था।
विनीत कोसाराजू जू

0

मुझे यह त्रुटि तब मिली जब विकास के माहौल से उत्पादन के माहौल में जा रहा था। मुझे https://सभी लिंक पर डालने का जुनून था । यह आवश्यक नहीं है, इसलिए यह कुछ के लिए एक समाधान हो सकता है।


0

मुझे http और अतिरिक्त स्लैश (/) से छुटकारा मिल गया। मैंने बस इस 'नोड-est.herokuapp.com' का इस्तेमाल किया और यह काम कर गया।


0

यदि अभी भी आप प्रॉक्सी सेटिंग के लिए चेकआउट का सामना कर रहे हैं, तो मेरे लिए यह प्रॉक्सी सेटिंग थी जो गायब थी और अनुरोध करने में सक्षम नहीं थी क्योंकि प्रत्यक्ष http / https अवरुद्ध है। इसलिए मैंने अनुरोध करते समय अपने संगठन से प्रॉक्सी को कॉन्फ़िगर किया।

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

कनेक्शन के लिए पासवर्ड से गैर-वांछनीय वर्णों को हटाकर मुझे यह समस्या हल हो गई। उदाहरण के लिए, मेरे पास ये पात्र थे: <##% और इसने समस्या का कारण बना (सबसे शायद हैश टैग समस्या का मूल कारण था)।


0

होस्टनाम के बजाय सर्वर आईपी पते का उपयोग करने का प्रयास करें। इसने मेरे लिए काम किया। आशा है कि यह आपके लिए भी काम करेगा।


0

मेरी समस्या यह थी कि हम url को पार्स कर रहे थे और http.request () के लिए http_options जनरेट कर रहे थे;

मैं request_url.host का उपयोग कर रहा था जिसमें पहले से ही डोमेन नाम के साथ पोर्ट नंबर था इसलिए 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;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.