Menu
CoddyTech

Interceptors

Teil des Abschnitts TypeScript und NestJS der Node.js-Journey von Coddy. Lektion 16 von 17.

Du möchtest, dass jede Antwort angibt, wie lange sie gedauert hat, ohne jeden Handler anzupassen. Ein Interceptor umschließt den Handler: Code vor next.handle() wird davor ausgeführt, und Code auf dem, was next.handle() zurückgibt, wird danach ausgeführt.

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

next.handle() liefert das Ergebnis des Handlers als RxJS-Observable, einen Wert, der später eintrifft. pipe(tap(...)) führt eine Funktion aus, wenn der Wert eintrifft, bevor Nest ihn sendet. Gib das Observable mit der Pipe zurück: Nest sendet, was es enthält. context.switchToHttp().getResponse() liefert res, dessen setHeader einen Header hinzufügt.

app.useGlobalInterceptors(...) wendet einen Interceptor auf jede Route an; @UseInterceptors(...) auf einen einzelnen Controller.

challenge icon

Aufgabe

Einfach
  • Schließe ResponseTimeInterceptor ab: Jede Antwort enthält X-Response-Time, also die Anzahl der Millisekunden, die der Handler benötigt hat, zum Beispiel 3ms.
  • Registriere ihn für die gesamte App.
  • Sende GET /tasks und GET /stats und öffne die Registerkarte „Kopfzeilen“. Sende anschließend POST /tasks ohne Schlüssel.

Probier es selbst

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> {
        // Merke dir die Zeit, lass den Handler laufen und setze dann X-Response-Time.
        return next.handle();
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in TypeScript und NestJS