سؤال

لقد حصلت على تطبيق Node.js الذي أريد استخدامه للتحقق مما إذا كان موقع معين يرتفع وإرجاع رمز الاستجابة المناسب. أريد أن أكون قادرًا على التقاط أي أخطاء تظهر لأن اسم المجال لا يحل أو يتم توقيت الطلب. المشكلة هي أن هذه الأخطاء تتسبب في اندلاع العقدة. أنا جديد على منهجية البرمجة غير المتزامنة بأكملها ، لذلك لست متأكدًا من أين أضع عبارات المحاولة/التقاط.

لدي مكالمة Ajax التي تنتقل إلى شيء مثل /check /site1. جانب الخادم الذي يستدعي وظيفة تحاول إجراء اتصال ثم إرجاع رمز الحالة. إنها وظيفة بسيطة للغاية ، وقد قمت بلف كل سطر في محاولة/تصطاد ولا تلتقط أي شيء أبدًا. ها هو:

function checkSite(url){
    var site = http.createClient(80, url);
    var request = site.request('GET', '/', {'host': url});
    request.end();
    return request;
  }

حتى مع كل من هذه الخطوط ملفوفة في محاولة/صيد ، سأظل أتلقى استثناءات غير معلنة مثل ehostunreach وما إلى ذلك. أريد أن أكون قادرًا على التقاطها وإعادة ذلك إلى مكالمة Ajax.

أي توصيات بشأن ما يجب تجربته بعد ذلك؟

هل كانت مفيدة؟

المحلول

http.createClient تم إهماله.

فيما يلي مثال سريع على كيفية التعامل مع الأخطاء باستخدام الجديد http.request:

var http = require("http");

var options = {
    host : "www.example.com"
};

var request = http.request(options, function(req) {
    ...
});
request.on('error', function(err) {
    // Handle error
});

request.end();

نصائح أخرى

لقد تعثرت في حل آخر أثناء البحث في مشكلة مماثلة. http.client ينبعث منه حدث "خطأ" إذا كان لا يمكن إنشاء اتصال لأي سبب من الأسباب. إذا تعاملت مع هذا الحدث ، فلن يتم طرح الاستثناء:

var http = require('http');
var sys = require('sys');

function checkSite(url) {
    var site = http.createClient(80, url);
    site.on('error', function(err) {
        sys.debug('unable to connect to ' + url);
    });
    var request = site.request('GET', '/', {'host': url});
    request.end();
    request.on('response', function(res) {
        sys.debug('status code: ' + res.statusCode);
    });
}

checkSite("www.google.com");
checkSite("foo.bar.blrfl.org");

بالطبع ، يصل خطأ الاتصال والاستجابة للطلب على حد سواء بشكل غير متزامن ، مما يعني أن مجرد إعادة الطلب لن يعمل. بدلاً من ذلك ، يجب عليك إخطار المتصل بالنتائج من معالجات الأحداث.

لسوء الحظ ، في الوقت الحالي ، لا توجد طريقة لالتقاط هذه الاستثناءات مباشرة ، لأن كل الأشياء تحدث بشكل غير متزامن في الخلفية.

كل ما يمكنك فعله هو التقاط uncaughtExceptionبمفردك:

var http = require('http');

function checkSite(url){
    var site = http.createClient(800, url);
    var request = site.request('GET', '/', {'host': url});
    request.end();
    return request;
}

process.on('uncaughtException', function (err) {
    console.log(err);
}); 

checkSite('http://127.0.0.1');

التي في هذه الحالة (منفذ الإشعار 800) سجلات:

{ message: 'ECONNREFUSED, Connection refused',
  stack: [Getter/Setter],
  errno: 111,
  syscall: 'connect' }

لا يزال Node.js تحت التطوير الثقيل ، ومن المؤكد أنه سيكون هناك الكثير من التقدم في الشهرين المقبلين ، ويبدو أن التركيز الآن على إصلاح أخطاء الأداء لـ 3.x وجعل واجهة برمجة التطبيقات مستقرة إلى حد ما ، لأنه بعد كل العقدة. JS هو أساسا خادم بحيث الإنتاجية مهمة.

تستطيع تقديم خطأ رغم ذلك ، ولكن يتم تحذيره من الحوادث وما إلى ذلك ، فهي ذات أولوية أعلى من الميزات ، ومعظم الميزات الجديدة تجعلها في عبر طلبات سحب الشوكة.

أيضا لخريطة الطريق الحالية لـ Node.js شاهد هذا الحديث بواسطة Ryan Dahl (منشئ العقدة):
http://developer.yahoo.com/yui/theater/video.php؟v=yuiconf2010-dahl

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top