В Iron параметры запроса строятся по принципу каскадной конфигурации: существуют глобальные настройки клиента, настройки экземпляра и локальные параметры конкретного вызова. Приоритет всегда остаётся за наиболее узким уровнем, что позволяет гибко управлять поведением библиотеки без дублирования конфигурации.
Любой вызов в Iron опирается на три уровня параметров:
Принцип переопределения: локальные параметры всегда имеют наивысший приоритет и перекрывают значения, заданные выше по иерархии.
Это поведение критично для сценариев, где один и тот же клиент используется в разных условиях: разные таймауты, заголовки, режимы кэширования или политики повторных попыток.
При создании клиента обычно задаются значения по умолчанию:
import { Iron } fr om "iron";
const client = new Iron({
baseURL: "https://api.service.com",
timeout: 5000,
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer TOKEN_DEFAULT"
}
});
Эти параметры применяются ко всем запросам, если они не переопределены на более низком уровне.
Основной механизм гибкости Iron заключается в возможности передать альтернативные параметры прямо в момент вызова метода.
const response = await client.get("/users", {
timeout: 10000,
headers: {
"Authorization": "Bearer TOKEN_SPECIAL"
}
});
В этом примере:
timeout заменяет значение 5000 на
10000Authorization перезаписывает глобальный заголовокContent-Type)
наследуются от клиентаВажно, что переопределение работает не на уровне полного замещения объекта, а на уровне слияния.
headers: {
"Authorization": "Bearer TOKEN_SPECIAL"
}
В данном случае:
headers не заменяет полностью глобальныйТаким образом, если глобально задано:
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer TOKEN_DEFAULT"
}
а локально передано:
headers: {
"Authorization": "Bearer TOKEN_SPECIAL"
}
итоговый набор будет:
{
"Content-Type": "application/json",
"Authorization": "Bearer TOKEN_SPECIAL"
}
Каждый HTTP-метод в Iron поддерживает локальные параметры.
client.get("/posts", {
params: {
lim it: 10,
sort: "desc"
}
});
Если глобально задано:
params: {
limit: 50
}
результат будет:
limit: 10 (локальный приоритет)sort: desc (добавлен локально)limit игнорируетсяДля методов с телом запроса переопределение работает аналогично:
client.post("/users", {
data: {
name: "Alex",
role: "admin"
}
});
Если глобально установлен шаблон:
data: {
role: "user",
active: true
}
результирующий payload:
{
name: "Alex",
role: "admin",
active: true
}
Локальный role перекрывает глобальный, остальные поля
объединяются.
Одним из наиболее частых сценариев является изменение сетевых ограничений для отдельных запросов.
client.get("/heavy-report", {
timeout: 30000,
retry: 0
});
Даже если клиент глобально настроен на:
timeout: 5000,
retry: 3
локальный вызов полностью заменяет поведение:
Iron позволяет временно направить запрос на другой сервер:
client.get("/status", {
baseURL: "https://backup.api.service.com"
});
Это полезно для:
Глобальный baseURL при этом не изменяется и остаётся
неизменным для других запросов.
Поведение системы можно формализовать:
Простые значения (number, string, boolean) полностью заменяются.
Объекты проходят частичное объединение.
В некоторых версиях Iron поддерживается передача конфигурации через функцию, что позволяет динамически изменять параметры перед отправкой запроса:
client.get("/profile", (config) => {
return {
...config,
timeout: config.env === "prod" ? 8000 : 2000
};
});
Это добавляет ещё один уровень гибкости:
При пересечении ключей действует строгая схема:
Пример:
global: { timeout: 5000 }
instance: { timeout: 7000 }
call: { timeout: 2000 }
итог: 2000
Часто встречаются логические ошибки при работе с вложенными объектами:
Понимание механизма слияния критично для предсказуемого поведения запросов.
При использовании цепочных вызовов параметры могут уточняться на каждом шаге:
client
.withConfig({ timeout: 8000 })
.get("/feed", { timeout: 2000 });
Здесь второй уровень перекрывает первый, несмотря на промежуточную настройку.
Переопределение параметров в Iron формирует основу гибкой конфигурации запросов, позволяя адаптировать поведение клиента без дублирования и без необходимости создавать новые экземпляры под каждую задачу.