Перехватчики
Часть раздела 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(...) — к одному контроллеру.
Задание
Легко- Заверши
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();
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.