node.js - شرح - express vpn




خطأ في التعامل مع مبادئ لتطبيقات Node.js+Express.js؟ (2)

لماذا المعلمة الأولى؟

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

try {
    setTimeout(function() {
        throw 'something broke' //Some random error
    }, 5)
}
catch(e) {
   //Will never get caught
}

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

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

الاستثناءات ، لماذا توجد

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

//This won't immediately crash if connection fails
var socket = require("net").createConnection(5000);
socket.on("error", function(err) {
    console.error("calm down...", err)
});

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

المجالات - تجميع الأحداث منطقيا

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

ES6

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

كوا (التي كتبها تي جيه Holowaychuck ، نفس المؤلف الأصلي من Express.js) بشكل ملحوظ يفعل هذا. ويستخدم عبارة ES6 yield لإنشاء كتل ، في حين تظهر تقريبا syncronous ، يتم التعامل معها في الشكل غير المتزامن للعقدة المعتادة:

app.use(function *(next) {
    try {
        yield next;
    } 
    catch (err) {
        this.status = err.status || 500;
        this.body = err.message;
        this.app.emit('error', err, this);
    }
});

app.use(function *(next) {
    throw new Error('some error');
})

تم سرقة هذا المثال بوقاحة من here .

يبدو أن الإبلاغ عن الخطأ / المعالجة يتم بشكل مختلف في تطبيقات Node.js + Express.js مقارنةً Express.js الأخرى. هل أنا صحيح في فهم أنه يعمل على النحو التالي؟

أ) كشف الأخطاء من خلال تلقيها كمعلمات لوظائف رد الاتصال الخاصة بك. فمثلا:

doSomethingAndRunCallback(function(err) { 
    if(err) { … }
});

B) تقرير الأخطاء في MIDDLEWARE عن طريق استدعاء التالي (يخطئ). مثال:

handleRequest(req, res, next) {
    // An error occurs…
    next(err);
}

C) تقرير الأخطاء في ROUTES عن طريق رمي الخطأ. مثال:

app.get('/home', function(req, res) {
    // An error occurs
    throw err;
});

D) معالجة الأخطاء عن طريق تكوين معالج الأخطاء الخاص بك عبر app.error () أو استخدام معالج خطأ الاتصال العام. مثال:

app.error(function(err, req, res, next) {
    console.error(err);
    res.send('Fail Whale, yo.');
});

هل هذه المبادئ الأربعة هي أساس كل معالجة الأخطاء / التقارير في تطبيقات Node.js + Express.js؟


معالجة الأخطاء في Node.js بشكل عام من التنسيق A). معظم الاسترجاعات بإرجاع كائن خطأ كوسيطة الأولى أو null .

يستخدم Express.js الوسيطة ويستخدم بناء الجملة الوسيطة B) و E) (المذكورة أدناه).

ج) هي ممارسة سيئة إذا سألتني.

app.get('/home', function(req, res) {
    // An error occurs
    throw err;
});

يمكنك بسهولة إعادة كتابة ما سبق

app.get('/home', function(req, res, next) {
    // An error occurs
    next(err);
});

بناء جملة الوسيطة صالح في get الطلب.

كما د)

(07:26:37 م) tjholowaychuk: يتم إزالة app.error في 3.x

TJ أكد للتو أن app.error يتم إيقاف app.error لصالح E

E)

app.use(function(err, req, res, next) {
  // Only handle `next(err)` calls
});

تعتبر أي برامج وسيطة ذات طول 4 (4 حجج) برامج وسيطة خطأ. عند اتصال واحد مكالمات next(err) اتصال يذهب ويستدعي الوسيطة المستندة إلى الخطأ.







express