מיירטים
חלק מהיחידה TypeScript ו-NestJS במסלול ה-Node.js של Coddy. שיעור 16 מתוך 17.
אתה רוצה שכל תשובה תציין כמה זמן היא ארכה, בלי לגעת בכל handler. מיירט עוטף את ה-handler: קוד שלפני next.handle() רץ לפניו, וקוד על מה ש-next.handle() מחזירה רץ אחריו.
intercept(context: ExecutionContext, next: CallHandler) {
console.log('before');
return next.handle().pipe(
tap(() => console.log('after')),
);
}next.handle() מספקת את תוצאת ה-handler כ-observable של RxJS, ערך שמגיע מאוחר יותר. pipe(tap(...)) מריצה פונקציה כשהערך מגיע, לפני ש-Nest שולחת אותו. החזר את ה-observable שעבר צינור: 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> {
// רשמו את השעה, אפשרו ל-handler לפעול, ואז הגדירו את X-Response-Time.
return next.handle();
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.