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.
Aufgabe
Einfach- Schließe
ResponseTimeInterceptorab: Jede Antwort enthältX-Response-Time, also die Anzahl der Millisekunden, die der Handler benötigt hat, zum Beispiel3ms. - Registriere ihn für die gesamte App.
- Sende
GET /tasksundGET /statsund öffne die Registerkarte „Kopfzeilen“. Sende anschließendPOST /tasksohne 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();
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.