Menu
CoddyTech

المعترضات

جزء من قسم TypeScript وNestJS في رحلة Node.js على Coddy. الدرس 16 من 17.

تريد أن توضّح كل إجابة المدة التي استغرقتها، من دون تعديل كل معالج. يغلّف المعترض المعالج: يُنفَّذ الرمز قبل next.handle() قبله، ويُنفَّذ الرمز على ما تُعيده next.handle() بعده.

intercept(context: ExecutionContext, next: CallHandler) {
    console.log('before');
    return next.handle().pipe(
        tap(() => console.log('after')),
    );
}

تعطي next.handle() نتيجة المعالج على هيئة قيمة قابلة للملاحظة من RxJS، وهي قيمة تصل لاحقًا. تنفّذ pipe(tap(...)) دالةً عند وصولها، قبل أن يرسلها Nest. أعد القيمة القابلة للملاحظة بعد تمريرها عبر pipe: يرسل Nest ما تحمله. تعطي context.switchToHttp().getResponse() القيمة res، التي تضيف ترويسةً باستخدام setHeader.

تطبّق app.useGlobalInterceptors(...) معترضًا على كل مسار؛ أما @UseInterceptors(...) فتطبّقه على متحكّم واحد.

challenge icon

التحدي

سهل
  • أكمل ResponseTimeInterceptor: يجب أن يتضمن كل ردّ X-Response-Time، أي عدد المللي ثانية التي استغرقها معالج الطلب، مثل 3ms.
  • سجّله للتطبيق بأكمله.
  • أرسل GET /tasks وGET /stats وافتح علامة التبويب Headers، ثم أرسل POST /tasks من دون مفتاح.

جرّب بنفسك

import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
import { Observable, tap } from 'rxjs';

@Injectable()
export class ResponseTimeInterceptor implements NestInterceptor {
    intercept(context: ExecutionContext, next: CallHandler): Observable<unknown> {
        // سجّل الوقت، ودع المعالج يعمل، ثم اضبط X-Response-Time.
        return next.handle();
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس TypeScript وNestJS