Проверяет понимание механизма перехватчиков в NestJS и их роли в обработке запросов, что важно для построения чистых и расширяемых серверных приложений.
Interceptors — это один из ключевых механизмов NestJS, встроенный в жизненный цикл обработки запроса. Они позволяют обернуть вызов обработчика контроллера дополнительной логикой, не изменяя сам обработчик. Это достигается за счёт использования RxJS Observable: метод intercept получает контекст выполнения и поток данных, который можно преобразовать, задержать или прервать.
Когда приходит HTTP-запрос, NestJS последовательно проходит через middleware, guards, interceptors, pipes и, наконец, вызывает метод контроллера. Interceptor вызывается до и после метода, что даёт две точки вмешательства: код до next.handle() и код в цепочке операторов RxJS после него.
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap, map } from 'rxjs/operators';
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const now = Date.now();
return next.handle().pipe(
tap(() => console.log(`Request took ${Date.now() - now}ms`)),
map(data => ({ success: true, data })),
);
}
}Подключить interceptor можно глобально через app.useGlobalInterceptors(), на уровне контроллера декоратором @UseInterceptors() или на конкретном методе.
@Controller('users')
@UseInterceptors(LoggingInterceptor)
export class UsersController {
@Get(':id')
findOne(@Param('id') id: string) {
return { id, name: 'Alice' };
}
}В этом примере каждый запрос к контроллеру будет логировать время выполнения и оборачивать ответ в объект с полем success.
Interceptors стоит применять, когда нужно добавить сквозную логику вокруг обработчиков, не дублируя код в каждом методе. Это делает приложение более чистым, тестируемым и расширяемым.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
Node.js
Nest.js
Ключевые слова
Подпишись на Node.js Developer в телеграм