Menu
CoddyTech

Interceptores

Parte de la sección TypeScript y NestJS del Journey de Node.js de Coddy. Lección 16 de 17.

Quieres que cada respuesta indique cuánto tardó, sin tocar cada controlador. Un interceptor envuelve el controlador: el código antes de next.handle() se ejecuta antes, y el código que actúa sobre lo que devuelve next.handle() se ejecuta después.

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

next.handle() proporciona el resultado del controlador como un observable de RxJS, un valor que llega más tarde. pipe(tap(...)) ejecuta una función cuando llega, antes de que Nest lo envíe. Devuelve el observable al que se aplicó el pipe: Nest envía lo que este contiene. context.switchToHttp().getResponse() proporciona res, cuyo setHeader agrega un encabezado.

app.useGlobalInterceptors(...) aplica un interceptor a todas las rutas; @UseInterceptors(...), a un controlador.

challenge icon

Desafío

Fácil
  • Termina ResponseTimeInterceptor: cada respuesta incluye X-Response-Time, los milisegundos que tardó el manejador, como 3ms.
  • Regístralo para toda la aplicación.
  • Envía GET /tasks y GET /stats y abre la pestaña Encabezados; después, envía POST /tasks sin una clave.

Pruébalo tú mismo

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> {
        // Registra la hora, deja que se ejecute el handler y luego establece X-Response-Time.
        return next.handle();
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de TypeScript y NestJS