Menu
CoddyTech

Перехватчики

Часть раздела TypeScript и NestJS путешествия по Node.js на Coddy. Урок 16 из 17.

Вы хотите, чтобы в каждом ответе указывалось, сколько времени он занял, и при этом не менять каждый обработчик. Перехватчик оборачивает обработчик: код перед next.handle() выполняется до него, а код, работающий с результатом next.handle(), — после него.

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

next.handle() возвращает результат обработчика в виде наблюдаемого объекта RxJS — значения, которое приходит позже. pipe(tap(...)) выполняет функцию, когда это значение приходит, прежде чем Nest отправит его. Верните наблюдаемый объект после вызова pipe: Nest отправит то, что он содержит. context.switchToHttp().getResponse() возвращает res, у которого setHeader добавляет заголовок.

app.useGlobalInterceptors(...) применяет перехватчик ко всем маршрутам; @UseInterceptors(...) — к одному контроллеру.

challenge icon

Задание

Легко
  • Заверши ResponseTimeInterceptor: каждый ответ содержит X-Response-Time — время в миллисекундах, которое потребовалось обработчику, например 3ms.
  • Зарегистрируй его для всего приложения.
  • Отправь GET /tasks и GET /stats и открой вкладку Headers, затем отправь POST /tasks без ключа.

Попробуйте сами

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> {
        // Запомните время, дайте обработчику выполниться, затем установите X-Response-Time.
        return next.handle();
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела TypeScript и NestJS