Вопрос проверяет понимание механизмов перехвата HTTP-запросов на уровне фреймворка для выполнения общей логики, такой как аутентификация, логирование или валидация.
Перехват HTTP-запроса до того, как он достигнет логики контроллера, — распространённая задача в веб-разработке. Это позволяет централизованно обрабатывать общие для многих маршрутов операции, такие как проверка аутентификации, логирование, преобразование данных, обработка CORS или валидация заголовков. Такой подход соответствует принципу DRY (Don't Repeat Yourself) и улучшает структуру приложения.
NestInterceptor. Они могут манипулировать потоком выполнения запроса.Вот простой пример middleware в Express.js для логирования:
// Middleware для логирования всех входящих запросов
const loggingMiddleware = (req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
// Вызов next() передаёт управление следующему middleware или роуту
next();
};
// Подключение middleware на уровне приложения
app.use(loggingMiddleware);
// Далее определяются маршруты (контроллеры)
app.get('/api/data', (req, res) => {
res.json({ message: 'Данные' });
});Пример глобального перехватчика в NestJS:
import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable {
const request = context.switchToHttp().getRequest();
console.log(`Запрос на: ${request.url}`);
const now = Date.now();
return next
.handle()
.pipe(
tap(() => console.log(`Запрос выполнен за ${Date.now() - now}ms`)),
);
}
}
// Подключение в основном модуле (app.module.ts)
// providers: [{
// provide: APP_INTERCEPTOR,
// useClass: LoggingInterceptor,
// }],Перехватчик в NestJS работает на более высоком уровне абстракции и имеет доступ к Observable потокам ответа, что позволяет легко добавлять логику до и после обработки контроллером.
Вывод: Перехват запроса до контроллера — ключевой паттерн для реализации сквозной функциональности. Используйте middleware в Express для простых задач или перехватчики в NestJS/Spring для более сложных сценариев с зависимостями и управляемым контекстом. Это необходимо для соблюдения безопасности, мониторинга и поддержания чистоты кода в бизнес-логике.