Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Node.js: middleware, interceptor, HTTP request, pre-controller, filter

Как перехватить HTTP-запрос до контроллера?

Вопрос проверяет понимание механизмов перехвата HTTP-запросов на уровне фреймворка для выполнения общей логики, такой как аутентификация, логирование или валидация.

Короткий ответ

Перехват HTTP-запроса до контроллера — это задача промежуточного ПО (middleware) или перехватчиков (interceptors). В Express.js это функции middleware, которые получают запрос, ответ и функцию next. В Nest.js используются перехватчики, реализующие интерфейс NestInterceptor. В Spring Framework для этого служат фильтры (Filters) или перехватчики (Interceptors). Общая идея: выполнить код (например, проверить заголовки) до того, как запрос попадёт в обработчик маршрута.

Длинный ответ

Перехват HTTP-запроса до того, как он достигнет логики контроллера, — распространённая задача в веб-разработке. Это позволяет централизованно обрабатывать общие для многих маршрутов операции, такие как проверка аутентификации, логирование, преобразование данных, обработка CORS или валидация заголовков. Такой подход соответствует принципу DRY (Don't Repeat Yourself) и улучшает структуру приложения.

Основные подходы в разных фреймворках

  • Express.js (Node.js): Используется концепция middleware. Это функции, которые имеют доступ к объектам запроса (req), ответа (res) и следующей функции middleware в стеке (next).
  • NestJS: Предлагает более структурированные перехватчики (Interceptors), которые реализуют интерфейс NestInterceptor. Они могут манипулировать потоком выполнения запроса.
  • Spring Framework (Java): Для перехвата запросов используются фильтры (Filters, Servlet API) или перехватчики (Interceptors) в контексте Spring MVC.

Примеры кода

Вот простой пример 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 для более сложных сценариев с зависимостями и управляемым контекстом. Это необходимо для соблюдения безопасности, мониторинга и поддержания чистоты кода в бизнес-логике.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Node.js

    Node.js

  • Nest.js

    Nest.js

Ключевые слова

#middleware

#interceptor

#HTTP request

#pre-controller

#filter

Подпишись на Java Developer в телеграм