Menu
CoddyTech

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.

challenge icon

Défi

Facile
  • Terminez ResponseTimeInterceptor : chaque réponse contient X-Response-Time, la durée en millisecondes du traitement par le gestionnaire, comme 3ms.
  • Enregistrez-le pour toute l’application.
  • Envoyez GET /tasks et GET /stats, puis ouvrez l’onglet Headers, ensuite envoyez POST /tasks sans 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();
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de TypeScript et NestJS