المعترضات
جزء من قسم 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(...) فتطبّقه على متحكّم واحد.
التحدي
سهل- أكمل
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();
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.