Menu
CoddyTech

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.

challenge icon

Desafio

Fácil
  • Conclua o ResponseTimeInterceptor: cada resposta inclui X-Response-Time, o tempo em milissegundos que o manipulador levou, como 3ms.
  • Registre-o para todo o aplicativo.
  • Envie GET /tasks e GET /stats e abra a aba Headers; em seguida, envie POST /tasks sem 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();
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de TypeScript e NestJS