المعترِضات (Interceptors)
المعترِضات (Interceptors)
يُغلّف المعترِض (interceptor) المعالجَ، مشغّلًا منطقًا قبله وبعده. مستوحاةً من البرمجة الموجَّهة بالجوانب، المعترِضات مثاليّة للسلوك العابر الذي لا تريد تكراره في كل معالج: تحويل الاستجابات، وتسجيل الأزمنة، والتخزين المؤقت، وإضافة المهل.
واجهة NestInterceptor
يُنفّذ المعترِض intercept(context, next). والمفتاح هو next.handle(): استدعاؤه يشغّل معالج المسار ويُعيد Observable من RxJS للاستجابة. تُضيف عوامل إلى ذلك التدفّق للتصرّف بعد المعالج:
تحويل الاستجابة
استخدام كلاسيكي هو تغليف كل استجابة في مظروف موحّد باستخدام عامل map:
قبل وبعد، في مكان واحد
لأنّ المنطق قبل next.handle() وداخل .pipe() يقعان في الدالّة نفسها، يستطيع المعترِض قياس المدّة، أو تعديل النتيجة، أو التقاط الأخطاء، أو الاختصار بقيمة مخزّنة — كلّه دون لمس المعالج.
أنماط المعترِضات الشائعة
- تشكيل الاستجابة — تغليف البيانات في بنية موحّدة (بـ
map). - التسجيل/التوقيت — تسجيل مدّة كل طلب (بـ
tap). - التخزين المؤقت — إعادة قيمة مخزّنة وتخطّي المعالج كلّيًا.
- المهل — إفشال طلب يطول أكثر من اللازم (بعامل
timeout). - التسلسل — إزالة الحقول الحسّاسة (مثل
ClassSerializerInterceptor).
تطبيق المعترِضات
map وtap، ابدأ بهذين — فهما يغطّيان معظم المعترِضات الواقعية.
الخلاصة
تُغلّف المعترِضات المعالج بمنطق قبل/بعد عبر intercept(context, next). استدعاء next.handle() يشغّل المعالج ويُعيد Observable تُحوّله بعوامل RxJS كـ map (إعادة تشكيل) وtap (آثار جانبية). استخدمها لمظاريف الاستجابة والتسجيل والتخزين المؤقت والمهل، مُطبَّقةً بـ @UseInterceptors(). تاليًا: مرشّحات الاستثناءات، التي تتحكّم بما يحدث عند الخطأ.