Axios → fetch у Node.js: як не пропустити зміну помилок і таймаутів

Node.jsHTTPміграція залежностей

Зелені тести ще не доводять, що вбудований fetch поводитиметься як Axios у робочому середовищі. Ось як перевірити статуси, таймаути, проксі, TLS і телеметрію та перейти без тихих збоїв

Зелені тести можуть приховати зміну поведінки

У pull request усе виглядає просто: видалено пакет Axios, змінено кілька викликів, тести пройшли. Але після розгортання зовнішній сервіс повертає 500, а застосунок більше не потрапляє у звичну гілку обробки помилки. Запит технічно завершився, проте його результат витлумачено інакше.

Саме так механічна заміна імпорту перетворюється на нічний сигнал тривоги. Команда має цілком нормальну мету — зменшити кількість залежностей і використовувати вбудований API Node.js. Та користувачі не повинні перевіряти сумісність замість розробників.

Під час такої зміни мігрує не лише синтаксис. Мігрує поведінковий контракт: які статуси вважаються помилками, коли запит припиняється, як читається тіло та які дані потрапляють у журнали й трасування.

Спочатку знайдіть приховану роботу Axios

Пошукайте не лише axios.get і axios.post. Перевірте axios.create, глобальні defaults, перехоплювачі, власні обгортки та модулі з назвами на кшталт apiClient або httpService.

Для кожного маршруту запишіть базову адресу, заголовки авторизації, параметри, формат тіла, таймаут, повторні запити та очікувану форму відповіді. Окремо позначте validateStatus, proxy, httpsAgent, responseType і обробку перенаправлень. Якщо ці правила не видно в місці виклику, їх міг додавати спільний перехоплювач.

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

Зафіксуйте сумісність до переписування

Офіційний матеріал Node.js звертає увагу на ключову різницю: Axios типово відхиляє проміс для статусів поза успішним діапазоном, а fetch повертає звичайний Response. Для 404 або 500 треба явно перевіряти response.ok чи response.status.

ДілянкаЩо перевірити
СтатусиЯкі коди стають помилками та які поля має помилка
ТілоКоли читати JSON, текст або потік; що робити з порожнім чи пошкодженим JSON
ТаймаутЯкий AbortSignal припиняє запит і як відрізнити таймаут від ручного скасування
RedirectЧи дозволені переходи та що стається з чутливими заголовками
Proxy і TLSЯк маршрут і сертифікати налаштовані саме у ваших версіях Node.js
StreamingЧи готовий код працювати з потоками fetch без буферизації всього тіла

Налаштування Axios не слід переносити за схожою назвою. Наприклад, httpsAgent не є готовою конфігурацією для fetch. Перевіряйте задокументований спосіб для своєї версії Node.js і реального мережевого маршруту.

Зробіть тонкий адаптер, а не копію Axios

У fetch немає API перехоплювачів Axios. Повторювані правила авторизації, журналювання, tracing і класифікації помилок краще зібрати у власному адаптері:

async function fetchJson(url, options = {}) {
  const response = await fetch(url, options);
  const text = await response.text();
  const data = text ? JSON.parse(text) : null;

  if (!response.ok) {
    const error = new Error(`HTTP ${response.status}`);
    error.status = response.status;
    error.body = data;
    throw error;
  }

  return { status: response.status, headers: response.headers, data };
}

const result = await fetchJson(url, {
  signal: AbortSignal.timeout(5_000)
});

Це лише початкова форма: політику для порожнього тіла, пошкодженого JSON і таймауту має визначити команда. Не намагайтеся відтворити весь Axios. І не додавайте автоматичний повтор кожного запиту: повторення POST може дублювати дію на сервері.

Перевіряйте обидва клієнти одним контрактом

Створіть спільний інтерфейс send(request) і запустіть однакові контрактні тести для Axios та нового адаптера. Локальний сервер або керований mock-сервіс має повертати 200, 404, 500, повільну відповідь, порожнє тіло, пошкоджений JSON, redirect і передчасний розрив з’єднання.

Перевіряйте не лише результат. Підтвердьте наявність заголовків авторизації та tracing, форму помилки, причину скасування й відсутність небезпечних повторів. Proxy, TLS і великі потоки додатково тестуйте в середовищі з реальною мережевою конфігурацією.

Вмикайте зміну так, щоб її можна було зупинити

Спочатку переведіть один безпечний зовнішній маршрут або малу частку трафіку. Порівнюйте частоту 4xx/5xx, таймаутів, скасувань і помилок розбору тіла, а також затримку на високих процентилях. Журнали старого й нового шляху повинні мати однакові ідентифікатори запиту.

Збережіть конфігураційний перемикач для швидкого відкату. Не надсилайте «тіньові» копії запитів із побічними ефектами лише заради порівняння. Умови зупинки — наприклад, зростання таймаутів або втрата трас — погодьте до розгортання, а не після першого збою.

Оберіть варіант за ризиком, а не за модою

Мігруйте зараз, якщо використання Axios централізоване, контракт описаний, а мережеві сценарії перевірені. Спочатку ізолюйте Axios за адаптером, якщо виклики й перехоплювачі розкидані по кодовій базі. Залиште його, якщо складні proxy, TLS або streaming-сценарії вже надійні, а користь від заміни не покриває вартість перевірки.

Хороший результат — не видалений пакет сам по собі. Це передбачувана поведінка HTTP-запитів і відкат, який команда справді може виконати.

Джерела

Короткий чеклист

  • знайти всі прямі й непрямі виклики Axios
  • зафіксувати очікувану поведінку для помилок і таймаутів
  • перевірити proxy, TLS, redirect і streaming у потрібній версії Node.js
  • запустити однакові контрактні тести для обох клієнтів
  • додати метрики, перемикач і перевірений відкат

План безпечної міграції з Axios на fetch

Допоможи спланувати міграцію HTTP-клієнта з Axios на вбудований fetch у Node.js. Вхідні дані: - версії Node.js у розробці, CI та робочому середовищі; - приклади викликів Axios і спільних обгорток; - налаштування axios.create, defaults та interceptors; - правила для 4xx/5xx, таймаутів, скасування й повторних запитів; - вимоги до proxy, TLS, redirect, streaming, auth і tracing; - доступні тести, метрики, спосіб поетапного ввімкнення та відкату. Не припускай, що заміна сумісна автоматично. Познач невідомі дані та питання, які треба перевірити. Поверни результат у такому форматі: 1. Короткий висновок про ризик. 2. Карта використання Axios. 3. Таблиця відмінностей: поточна поведінка, бажана поведінка, тест, ризик. 4. Мінімальний інтерфейс адаптера над fetch. 5. Набір контрактних тестів із конкретними сценаріями. 6. План поетапного ввімкнення, метрики й умови зупинки. 7. План відкату. 8. Рекомендація: мігрувати зараз, спершу ізолювати Axios або залишити його.