NestJS / المتوسط: السياسات والموائمات والمصادر / الدرس 9
المعترضات وObservable والتسلسل الآمن
لف تنفيذ النتيجة بقصد مع الحفاظ على سلوك التدفق والشكل العام ومعنى الاستثناء.
في هذه الصفحة
أهداف الدرس
- اشرح next.handle وترتيب دخول المعترض وخروجه.
- افصل إسقاط الإخراج عن سياسة الوصول وصحة المخبأ.
يحيط المعترض بحد تنفيذ
ينفذ المعترض منطقاً قبل المعالج ويحوّل مسار Observable بعده. تمثل next.handle الاستمرار؛ وقد يتجاوز إرجاع دونها المعالج بقصد أو خطأ. يفك الخروج تداخل المعترضات بعكس ترتيبه. وضح التوقيت والإسقاط وتكييف الخطأ ولا تعتبر اللف معاملة تخزين أو الغلاف إثبات أهلية. راجع ملاءمة المكون لـHTTP أو RPC أو التدفق قبل تعميمه. قد يناسب غلاف data نتيجة مفردة ويكسر بروتوكول أحداث، لذلك تتبع صيغة الإخراج عقد النقل لا رغبة تنظيم شكل كل رد بالقالب نفسه.
حول نتيجة معتادة دون إخفاء الفشل
يلف المعترض التوضيحي الإصدارات الناجحة تحت data بواسطة map من RxJS، مع افتراض التعريف والتسجيل. لا يلتقط الفشل ولا يفرض الغلاف لكل عنوان. قد يضاعف لف نتيجة ملفوفة، وقد لا يحقق المقصود مع رد أصلي تجاوز إدارة الإطار. اختبر الشكل وقناة الخطأ. في التدفق لا يساوي إصدار واحد رد HTTP كاملاً، وقد يدمر تحويل التدفق لمجموعة لبناء ملخص حدود الذاكرة. لا يشغل الجزء Observable حقيقية؛ يشرح التحويل الذي يجب أن يراجع مع نوع النتيجة الفعلي.
@Injectable()
export class EnvelopeInterceptor implements NestInterceptor {
intercept(context: ExecutionContext,next: CallHandler) {
return next.handle().pipe(map(value => ({data:value})));
}
}
تفترض استيرادات RxJS وNest. يصف تحول الإصدار ولم يسجل أو ينفذ.
تعمل بيانات الفئة عبر دمجها الفعلي فقط
يمكن للتسلسل القائم على الفئة استبعاد أو إظهار خصائص وفق المعترض والمثيل المختارين. لا يثبت كائن يشبه الفئة أن بيانات الاستبعاد عملت. أعد نموذجاً مقصوداً وأكد المفاتيح الخارجة. يوثق Nest 12 بدائل إخراج بمخططات؛ اختر واربط نهجاً ولا تفترض أن الإعلان يفرض نفسه. لا تكشف كائناً ممنوعاً ثم تحاول إخفاء حقل فقط. طبق الأهلية أولاً وأبعد حقول التخزين الداخلية. تختلف صحة الإسقاط عن قرار السماح، ويحتاج كل منهما عينات تثبت حدود ما يفعله فعلاً.
اختبر الشكل وعدم تغيير الأصل محلياً
تبني الدالة غلافاً جديداً حول إسقاط بطاقة ضيق وتترك المصدر دون تغيير وتحذف سراً اصطناعياً. تثبت ربطاً عادياً لا بيانات class-transformer أو إكمال RxJS أو ربط المعترض. يختبر الإخراج الحقيقي المصفوفة وnull والخطأ والغلاف السابق وفق العقد. لا تضف موائماً عاماً يغير كل تمثيل بصمت؛ يختلف التنزيل و204 والحدث الحي عن بطاقة JSON. فاختبار الشكل المحلي خطوة مفيدة لكنه لا يصادق أن الكود سيطبق على النوع المناسب أو يحفظ سلوك النقل عند الاستثناء.
function publicEnvelope(source) {return {data:{id:source.id,title:source.title}};}
const source={id:"c1",title:"Interceptors",secret:"lab-only"};
const result=publicEnvelope(source);
console.assert(JSON.stringify(result) === '{"data":{"id":"c1","title":"Interceptors"}}');
console.assert(source.secret === "lab-only");
console.assert(!Object.hasOwn(result.data,"secret"));
تحتوي النتيجة المفاتيح المختارة ويبقى الأصل دون تغيير، ولم يشغل Observable أو مسلسل.
قس وكيف دون ابتلاع العقد
راقب النجاح والفشل والإلغاء بإنهاء مناسب دون تحويل الجميع لنجاح. قد يخفي catch مع بديل تعذر مصدر صلاحية أو كتابة فاشلة داخل 2xx مضللة. تحتاج المهلة دعم إلغاء المصدر؛ لا يتراجع وقف الاشتراك عن كل عمل خارجي. قيد تسميات الرصد وأبعد السر. تحقق من الربط عبر الحاوية للاعتماد. يشغل المقرر الإسقاط فقط ويترك الاشتراك والإلغاء والرد والتسلسل دون اختبار. يفيد التقرير الصادق في فصل وجود map صحيحة عن صحة عمل معترض مسجل في التطبيق الفعلي.
الأخطاء الشائعة وإصلاحها
لا يعمل المتحكم
- لماذا يحدث؟
- عاد المعترض من دون استدعاء الاستمرار الذي كان ينبغي أن يشغل المعالج.
- كيف تصلحه؟
- استدع next.handle في المسار الذي يجب أن يواصل التنفيذ.
- كيف تتجنب تكراره؟
- أكد استدعاءات المعالج وحالات تجاوز التنفيذ المقصودة.
يحمل الرد data.data دون قصد
- لماذا يحدث؟
- طبقت طبقات متعددة غلاف النتيجة نفسه على البيانات.
- كيف تصلحه؟
- عين مسؤولاً واحداً عن شكل الإخراج النهائي.
- كيف تتجنب تكراره؟
- اختبر المفاتيح المتداخلة الدقيقة والتمثيلات الخاصة، لا الحالة فقط.
يصبح الفشل بديلاً يبدو ناجحاً
- لماذا يحدث؟
- محا تكييف الخطأ معنى فشل المجال أو متطلبات السلطة.
- كيف تصلحه؟
- احفظ فئات الفشل ودلالتها مع إفصاح عام آمن.
- كيف تتجنب تكراره؟
- اختبر تعذر مصدر الصلاحيات ونتائج الكتابة غير المؤكدة.
اختبر فهمك
1. لماذا لا يثبت اختبار كائن عادي صحة التسلسل القائم على الفئة؟
اعرض الحل المشروح
لا ينشئ الاختبار الفئة ولا يستدعي المسلسِل المضبوط أو بياناتها الوصفية. قد يوافق الإخراج الشكل المتوقع مصادفة بينما المعترض الحقيقي غير مربوط أو يستقبل نوعاً آخر. احتفظ باختبار الإسقاط النقي، ثم تحقق مستقلاً من مثيلات الفئة وربط المعترض والمفاتيح العامة الدقيقة عبر دمج Nest المقصود.
2. هل يستطيع معترض المهلة ضمان توقف عمل المصدر؟
اعرض الحل المشروح
لا. يستطيع إنهاء مسار النتيجة الذي يراقبه، لكن المهمة الخارجية قد تستمر ما لم يصل الإلغاء إلى موائم يدعمه. راقب تنظيف المورد فعلياً في اختبار مصدر معزول، واحفظ عدم يقين نتائج الكتابات. لا تستنتج تراجع التخزين من مهلة Observable أو من رفض وعد وحده.
أهم ما تعلمته
- يلف المعترض دورة نتيجة محددة لا كل ضمان عمل.
- يحتاج التسلسل حداً فعلياً مضبوطاً.