Жизненный цикл запроса

Обработка HTTP-запроса в Iron строится вокруг последовательной цепочки этапов, в которой каждый шаг формирует контекст выполнения, влияет на поток данных и определяет итоговую структуру ответа.

На уровне сервера входящий HTTP-запрос попадает в транспортный слой Node.js, после чего передаётся в ядро Iron. На этом этапе создаётся объект контекста выполнения запроса, включающий:

  • входящий request с заголовками, методом, URL и телом
  • пустую заготовку response
  • служебные поля для промежуточных данных
  • ссылки на внутренние механизмы маршрутизации и обработчиков

Контекст выступает единым контейнером состояния, через который проходят все последующие стадии жизненного цикла.

Предобработка и глобальные middleware

Перед маршрутизацией запрос проходит через цепочку глобальных middleware. Эти функции выполняются последовательно и могут:

  • модифицировать входящие данные
  • выполнять логирование
  • добавлять метаданные в контекст
  • завершать выполнение до маршрутизации при необходимости

Модель построена на принципе «коридора обработки», где каждый middleware получает контроль над потоком выполнения и может передать его дальше через явный переход.

Ключевым свойством этого этапа является возможность асинхронной обработки. Middleware может приостанавливать выполнение до завершения операций ввода-вывода, не блокируя основной поток сервера.

Маршрутизация запроса

После прохождения глобального слоя выполняется сопоставление запроса с зарегистрированными маршрутами. Маршрутизатор анализирует:

  • HTTP-метод (GET, POST, PUT, DELETE и т.д.)
  • путь запроса
  • параметры маршрута
  • дополнительные условия (например, заголовки или версии API)

Результатом становится выбор конкретного обработчика, связанного с маршрутом. Если соответствие не найдено, управление передаётся в механизм обработки ошибок уровня «404».

Подготовка параметров и валидация

Перед передачей управления в обработчик маршрута выполняется стадия нормализации входных данных. В зависимости от конфигурации системы могут быть активированы:

  • парсинг JSON или form-data
  • преобразование типов параметров
  • проверка схемы входных данных
  • валидация query и path параметров

На этом этапе часто подключаются схемы валидации, которые позволяют гарантировать структуру данных до попадания в бизнес-логику. При нарушении условий выполнение перенаправляется в обработчик ошибок валидации.

Выполнение обработчика маршрута

Основной этап жизненного цикла связан с вызовом функции обработчика. Она получает доступ к контексту запроса и управляет формированием результата.

Внутри обработчика обычно выполняются:

  • бизнес-логика приложения
  • обращения к базе данных или внешним сервисам
  • преобразование данных
  • формирование структуры ответа

Execution model поддерживает асинхронные операции через async/await, что позволяет выстраивать линейную логику поверх неблокирующего ввода-вывода.

Контекст при этом может расширяться: добавляются промежуточные результаты, вычисленные значения, кэшированные данные.

Постобработка результата

После завершения обработчика результат передаётся в слой постобработки. Этот этап отвечает за:

  • сериализацию данных в JSON или другой формат
  • установку HTTP-заголовков
  • формирование статуса ответа
  • применение трансформаций (например, обёртка ответа в стандартную структуру API)

Если обработчик вернул сырые данные, система приводит их к корректному HTTP-ответу, учитывая конфигурацию приложения.

Обработка ошибок

Механизм ошибок встроен в каждый этап жизненного цикла. При возникновении исключения управление передаётся в специализированную цепочку error-handlers.

Типовые сценарии:

  • ошибки маршрутизации (404)
  • ошибки валидации (400)
  • системные исключения (500)
  • пользовательские ошибки бизнес-логики

Error-handlers получают доступ к контексту запроса и могут формировать отдельный формат ответа, не зависящий от стандартного потока обработки.

Важным свойством является возможность централизованного перехвата ошибок на любом этапе цепочки.

Финализация ответа и отправка клиенту

После завершения всех преобразований формируется финальный HTTP-ответ. На этом этапе выполняются:

  • запись заголовков в поток ответа
  • сериализация тела ответа
  • установка статуса HTTP
  • отправка данных через транспортный слой Node.js

После отправки ответ считается завершённым, а контекст запроса закрывается.

Хуки жизненного цикла

Iron предоставляет систему хуков, позволяющую подключаться к ключевым точкам жизненного цикла. Основные точки расширения:

  • до маршрутизации
  • после выбора маршрута
  • перед выполнением обработчика
  • после формирования ответа
  • при возникновении ошибки

Хуки позволяют реализовывать кросс-срезные задачи:

  • трассировка запросов
  • мониторинг производительности
  • модификация контекста
  • аудит действий

Каждый хук получает доступ к текущему состоянию запроса, что обеспечивает гибкость расширения без изменения основной логики.

Асинхронная модель выполнения

Жизненный цикл запроса в Iron полностью ориентирован на неблокирующую модель. Все этапы, начиная с middleware и заканчивая обработчиком, могут выполняться асинхронно.

Это приводит к следующим особенностям:

  • параллельная обработка множества запросов
  • отсутствие блокировки event loop
  • возможность ожидания внешних ресурсов без деградации производительности
  • предсказуемая модель конкурентного выполнения

Асинхронность пронизывает весь жизненный цикл, формируя единый поток управления через промисы и контекст выполнения.

Изоляция контекста запроса

Каждый запрос получает собственный независимый контекст. Это означает:

  • отсутствие разделяемого состояния между запросами
  • безопасность данных внутри одного потока выполнения
  • возможность параллельной обработки без конфликтов

Контекст живёт только в пределах одного жизненного цикла и уничтожается после отправки ответа, что исключает утечки состояния между запросами.

Завершение жизненного цикла и освобождение ресурсов

После отправки ответа происходит финальная стадия:

  • освобождение памяти, связанной с контекстом
  • закрытие временных ресурсов (стримов, буферов)
  • завершение внутренних подписок

Система возвращается в состояние ожидания следующего запроса, сохраняя минимальный накладной расход между циклами обработки.