Intercepteurs
Fait partie de la section TypeScript et NestJS du Journey Node.js de Coddy. Leçon 16 sur 17.
Tu veux que chaque réponse indique le temps qu’elle a pris, sans toucher à chaque gestionnaire. Un intercepteur enveloppe le gestionnaire : le code qui précède next.handle() s’exécute avant lui, et le code portant sur ce que renvoie next.handle() s’exécute après.
intercept(context: ExecutionContext, next: CallHandler) {
console.log('before');
return next.handle().pipe(
tap(() => console.log('after')),
);
}next.handle() fournit le résultat du gestionnaire sous forme d’observable RxJS, une valeur qui arrive plus tard. pipe(tap(...)) exécute une fonction lorsque cette valeur arrive, avant que Nest ne l’envoie. Retourne l’observable transformé par pipe : Nest envoie ce qu’il contient. context.switchToHttp().getResponse() fournit res, dont setHeader ajoute un en-tête.
app.useGlobalInterceptors(...) applique un intercepteur à toutes les routes ; @UseInterceptors(...), à un seul contrôleur.
Défi
Facile- Terminez
ResponseTimeInterceptor: chaque réponse contientX-Response-Time, la durée en millisecondes du traitement par le gestionnaire, comme3ms. - Enregistrez-le pour toute l’application.
- Envoyez
GET /tasksetGET /stats, puis ouvrez l’onglet Headers, ensuite envoyezPOST /taskssans clé.
Essayez vous-même
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> {
// Notez l’heure, laissez le gestionnaire s’exécuter, puis définissez X-Response-Time.
return next.handle();
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.