Interceptadores
Parte da seção TypeScript e NestJS do Journey de Node.js da Coddy. Lição 16 de 17.
Você quer que cada resposta informe quanto tempo levou, sem precisar alterar cada manipulador. Um interceptor envolve o manipulador: o código antes de next.handle() é executado antes dele, e o código sobre o que next.handle() retorna é executado depois.
intercept(context: ExecutionContext, next: CallHandler) {
console.log('before');
return next.handle().pipe(
tap(() => console.log('after')),
);
}next.handle() fornece o resultado do manipulador como um observable RxJS, um valor que chega mais tarde. pipe(tap(...)) executa uma função quando ele chega, antes de o Nest enviá-lo. Retorne o observable encadeado: o Nest envia o que ele contém. context.switchToHttp().getResponse() fornece res, cujo setHeader adiciona um cabeçalho.
app.useGlobalInterceptors(...) aplica um interceptor a todas as rotas; @UseInterceptors(...), a um único controlador.
Desafio
Fácil- Conclua o
ResponseTimeInterceptor: cada resposta incluiX-Response-Time, o tempo em milissegundos que o manipulador levou, como3ms. - Registre-o para todo o aplicativo.
- Envie
GET /taskseGET /statse abra a aba Headers; em seguida, enviePOST /taskssem uma chave.
Experimente você mesmo
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> {
// Registre o horário, deixe o handler executar e, em seguida, defina X-Response-Time.
return next.handle();
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.