Menu
CoddyTech

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.

challenge icon

Wyzwanie

Łatwy
  • Dokończ ResponseTimeInterceptor: każda odpowiedź zawiera X-Response-Time, czyli czas obsługi w milisekundach, na przykład 3ms.
  • Zarejestruj go dla całej aplikacji.
  • Wyślij GET /tasks i GET /stats, a następnie otwórz kartę Headers. Potem wyślij POST /tasks bez 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();
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji TypeScript i NestJS