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.
Desafío
Fácil- Termina
ResponseTimeInterceptor: cada respuesta incluyeX-Response-Time, los milisegundos que tardó el manejador, como3ms. - Regístralo para toda la aplicación.
- Envía
GET /tasksyGET /statsy abre la pestaña Encabezados; después, envíaPOST /taskssin 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();
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.