Node.js getaddrinfo ENOTFOUND




(11)

عند استخدام Node.js لمحاولة الحصول على محتوى html لصفحة الويب التالية:

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)

لقد قمت بالفعل بالبحث عن هذا الخطأ على stackoverflow ، وأدركت أن هذا لأن node.js لا يمكن العثور على الخادم من 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);
    });
});

في ما يلي المصدر الذي قمت بنسخه ولصقه من: كيفية إجراء مكالمات خدمة ويب في Expressjs؟

أنا لا أستخدم أي وحدات مع node.js.

شكرا للقراءة،

فينيت


أصلحت هذا الخطأ بهذا

$ 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


أعتقد أن http يجعل الطلب على المنفذ 80 ، على الرغم من أنني ذكرت عنوان url الخاص بالمستضيف كاملاً في كائن الخيارات. عندما أقوم بتشغيل تطبيق الخادم الذي يحتوي على واجهة برمجة التطبيقات ، على المنفذ 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();

إذا كنت لا تزال تواجه إتمام عملية إعداد البروكسي ، فبالنسبة لي كان إعداد الخادم الوكيل مفقودًا ولم يكن قادرًا على تقديم الطلب نظرًا لأنه يتم حظر 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
};

حصلت على هذا الخطأ عند الانتقال من بيئة التطوير إلى بيئة الإنتاج. كنت مهووس بوضع https:// على جميع الروابط. هذا ليس ضروريا ، لذلك قد يكون حلا للبعض.


في وثائق وحدة 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',
  path: '/wiki/EteRNA_Dictionary'
}

كان الحل لهذا الخطأ بالنسبة لي هو تثبيت http مع مدير حزمة العقدة:

npm install http-server -g

كنت أتلقى الخطأ نفسه واستخدم أدناه الرابط أدناه للحصول على المساعدة:

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

لم أكن أواجه في رمز بلدي:

req.end();

(NodeJs V: 5.4.0) بمجرد إضافتها أعلاه req.end(); خط ، كنت قادرا على التخلص من الخطأ وعملت بشكل جيد بالنسبة لي.


لاحظ أنه يمكن أن تحدث هذه المشكلة أيضًا إذا تم تغيير المجال الذي يتم الرجوع إليه (EG. لم يعد موجودًا.)


لقد تم حل هذه المشكلة عن طريق إزالة أحرف غير مرغوبة من كلمة المرور للاتصال. على سبيل المثال ، كان لدي هذه الأحرف: <##٪ وتسببت في المشكلة (على الأغلب كانت علامة التجزئة هي السبب الجذري للمشكلة).


لقد حاولت ذلك باستخدام وحدة الطلب ، وتمكنت من طباعة نص تلك الصفحة بسهولة. للأسف مع المهارات التي لدي ، لا يسعني إلا غير ذلك.


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

  });




node.js