خطأ في التعامل مع تدفقات node.js


1 Answers

النطاقات موقوفة. لا تحتاج لهم.

لهذا السؤال ، التمييز بين التحويل أو للكتابة ليست مهمة جدا.

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

var a = createReadableStream()
var b = anotherTypeOfStream()
var c = createWriteStream()

a.on('error', handler)
b.on('error', handler)
c.on('error', handler)

a.pipe(b).pipe(c)

function handler (err) { console.log(err) }

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

Question

ما الطريقة الصحيحة للتعامل مع الأخطاء مع مجموعات البث؟ أعلم بالفعل أن هناك حدث "خطأ" يمكنك الاستماع إليه ، لكنني أريد معرفة المزيد من التفاصيل حول الحالات المعقدة بشكل تعسفي.

بالنسبة للمبتدئين ، ماذا تفعل عندما تريد القيام بسلسلة أنابيب بسيطة:

input.pipe(transformA).pipe(transformB).pipe(transformC)...

وكيف يمكنك إنشاء أحد هذه التحويلات بشكل صحيح حتى يتم التعامل مع الأخطاء بشكل صحيح؟

المزيد من الأسئلة ذات الصلة:

  • عندما يحدث خطأ ما ، ماذا يحدث لحدث "النهاية"؟ هل لا تطلق؟ هل تطلق في بعض الأحيان؟ هل يعتمد على التحويل / التيار؟ ما هي المعايير هنا؟
  • هل هناك أي آليات لنشر الأخطاء من خلال الأنابيب؟
  • هل النطاقات تحل هذه المشكلة بفاعلية؟ الأمثلة ستكون لطيفة.
  • هل الأخطاء التي تخرج من أحداث "الخطأ" لها آثار كومة؟ بعض الأحيان؟ أبدا؟ هل هناك طريقة للحصول على واحد منهم؟



.on("error", handler) فقط يعتني أخطاء دفق ولكن إذا كنت تستخدم دفق Transform مخصص ، لا .on("error", handler) التقاط الأخطاء التي تحدث داخل دالة _transform . حتى يمكن للمرء القيام بشيء كهذا للتحكم في تدفق التطبيقات: -

this الكلمة الرئيسية في دالة _transform إلى Stream نفسها ، وهو EventEmitter . لذلك يمكنك استخدام try catch مثل أدناه للقبض على الأخطاء ثم نقلها إلى معالجات الأحداث المخصصة.

// CustomTransform.js
CustomTransformStream.prototype._transform = function (data, enc, done) {
  var stream = this
  try {
    // Do your transform code
  } catch (e) {
    // Now based on the error type, with an if or switch statement
    stream.emit("CTError1", e)
    stream.emit("CTError2", e)
  }
  done()
}

// StreamImplementation.js
someReadStream
  .pipe(CustomTransformStream)
  .on("CTError1", function (e) { console.log(e) })
  .on("CTError2", function (e) { /*Lets do something else*/ })
  .pipe(someWriteStream)

بهذه الطريقة ، يمكنك الحفاظ على منطق معالجات الخطأ والمنطق. أيضا ، يمكنك اختيار التعامل مع بعض الأخطاء فقط وتجاهل الآخرين.




Related