Interceptory
Część sekcji TypeScript i NestJS ścieżki Node.js w Coddy. Lekcja 16 z 17.
Chcesz, aby każda odpowiedź informowała, ile czasu zajęło jej wygenerowanie, bez modyfikowania każdego handlera. Interceptor otacza handler: kod przed next.handle() uruchamia się przed nim, a kod wykonujący się na tym, co zwraca next.handle(), działa po nim.
intercept(context: ExecutionContext, next: CallHandler) {
console.log('before');
return next.handle().pipe(
tap(() => console.log('after')),
);
}next.handle() udostępnia wynik handlera jako observable RxJS, czyli wartość, która pojawia się później. pipe(tap(...)) uruchamia funkcję, gdy ta wartość się pojawi, zanim Nest ją wyśle. Zwróć observable po zastosowaniu pipe: Nest wysyła to, co ono zawiera. context.switchToHttp().getResponse() udostępnia res, a jego setHeader dodaje nagłówek.
app.useGlobalInterceptors(...) stosuje interceptor do każdej trasy; @UseInterceptors(...) — do jednego kontrolera.
Wyzwanie
Łatwy- Dokończ
ResponseTimeInterceptor: każda odpowiedź zawieraX-Response-Time, czyli czas obsługi w milisekundach, na przykład3ms. - Zarejestruj go dla całej aplikacji.
- Wyślij
GET /tasksiGET /stats, a następnie otwórz kartę Headers. Potem wyślijPOST /tasksbez klucza.
Spróbuj swoich sił
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> {
// Zanotuj czas, pozwól wykonać się funkcji obsługi, a następnie ustaw X-Response-Time.
return next.handle();
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.