محتويات الدورة

Node.js / المتوسط: حدود التطبيق / الدرس 8

حدود الأخطاء والإلغاء

احتفظ بالأسباب المفيدة وصنف الإخفاقات المتوقعة واجعل الإلغاء جزءا من عقد العملية.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • اشرح المفاهيم والمفاضلات المتعلقة بموضوع «حدود الأخطاء والإلغاء».
  • توقع المثالين وتحقق من مخرجاتهما وسلوك تنظيف الموارد فيهما.
  • شخّص الإخفاقات الثلاثة الشائعة وطبق الحلول المشروحة على مدخلات مشابهة.

الإخفاق يحتاج إلى مسؤول

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

استخدام تصنيف مستقر

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

ترجمة الأخطاء مرة واحدة

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

javascript مثال كامل: ترجمة الأخطاء مرة واحدة
class DataError extends Error {
  constructor(cause) { super('Stored data is invalid', { cause }); this.code = 'BAD_DATA'; }
}
function decode(text) {
  try { return JSON.parse(text); } catch (cause) { throw new DataError(cause); }
}
try { decode('{'); }
catch (error) {
  console.log(error.code, error.cause.name);
  console.log('Public response: internal_error');
}
الناتج المتوقع
BAD_DATA SyntaxError
Public response: internal_error

لا تكشف الرسالة العامة المحتوى المخزن، بينما يحتفظ الخطأ التشخيصي بسبب التحليل.

تمرير الإلغاء

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

javascript مثال كامل: تمرير الإلغاء
import { setTimeout as delay } from 'node:timers/promises';
async function load({ signal }) {
  await delay(1000, undefined, { signal });
  return 'loaded';
}
const controller = new AbortController();
const result = load({ signal: controller.signal });
controller.abort();
try { await result; }
catch (error) {
  if (error.name !== 'AbortError') throw error;
  console.log('request canceled; no retry');
}
الناتج المتوقع
request canceled; no retry

تصل الإشارة إلى عملية الانتظار الفعلية فيحرر الإلغاء مؤقتها بدلا من تجاهل النتيجة فقط.

إعادة المحاولة لسبب واضح

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

الأخطاء الشائعة وإصلاحها

تخفي catch كل الإخفاقات

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

يواصل طلب ملغى إعادة المحاولة

لماذا يحدث؟
لم تراقب شيفرة المحاولة إشارة المستدعي.
كيف تصلحه؟
افحص الإلغاء قبل المحاولات وخلال الانتظار.
كيف تتجنب تكراره؟
استخدم مهلة شاملة وإشارة مشتركة للمحاولات.

تحدث كتابة خارجية مرتين

لماذا يحدث؟
افتُرض أن المهلة تعني غياب الأثر.
كيف تصلحه؟
استخدم مفاتيح منع التكرار أو سوّ النتيجة البعيدة.
كيف تتجنب تكراره؟
حدد معاني إعادة المحاولة قبل تشغيلها آليا.

اختبر فهمك

1. تعيد اعتمادية خطأ مدخل غير صالح دائم. هل تكرره دالة عامة ثلاث مرات؟

اعرض الحل المشروح

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

2. كيف يحتفظ غلاف بفشل اتصال منخفض المستوى دون كشفه للمستخدم؟

اعرض الحل المشروح

أنشئ خطأ تطبيق برمز مستقر واجعل Error الأصلية cause. سجل السياق التشخيصي المعتمد فقط تحت معرف طلب، وأعد رسالة عامة لعدم توفر الاعتمادية. يحفظ ذلك تفاصيل التحقيق واستقرار العقد العام.

أهم ما تعلمته

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

المراجع الرسمية