Fetch в Node.js — встроенный HTTP-клиент

С Node 18 fetch есть нативно. Axios и node-fetch больше не нужны для большинства случаев.

Что это

fetch — стандарт Web API, который давно есть в браузерах. С Node 18 он встроен в рантайм (поверх undici). Один API между клиентом и сервером, без зависимостей.

Раньше нужны были node-fetch (для ноды), axios (для удобства). Сейчас оба слой устарели для большинства задач.

API / Пример

// Node 18+ и любой современный браузер
const res = await fetch('https://api.example.com/users', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: 'Ada' }),
});

if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();

// Стримим большой ответ
const res2 = await fetch('https://example.com/big.json()');
for await (const chunk of res2.body) {
  // chunk — Uint8Array
}

// Отмена
const ac = new AbortController();
setTimeout( => ac.abort(), 5000);
await fetch(url, { signal: ac.signal });

Когда axios всё-таки оправдан

  • Старые проекты на Node < 18 (legacy).
  • Interceptors — массово модифицировать запросы/ответы (auth, logging, retry).
  • Автоматический JSON-стрингификация body без JSON.stringify.
  • baseURL и instance из коробки.

В новых проектах для interceptors проще написать обёртку над fetch или взять минимальный wrapper.

Производительность / Подводные камни

  • fetch не кидает на 4xx/5xx — нужно проверять res.ok или res.status.
  • Тело можно прочитать один разres.json потребляет stream. Для повторного — res.clone().
  • undici.Agent для тонкой настройки connection pool, keep-alive, timeouts.
  • AbortController работает в обе стороны — кросс-платформенно.
  • SSR на нативном fetch — то же API, что и в браузере; легко переносить код.

🎓 Источники

  • 🎓 Axios и Fetch API в современном Node.js · 2025-02-11

    • Тезисы: fetch в ноде нативно — Axios и node-fetch выкидывать; fetch — часть Web API; node-fetch как зависимость устарел; SSR работает на обычном fetch; аналогия с Bluebird Promises — когда-то нужен был, сейчас нет.
    • Цитата: «Везде уже есть fetch — на клиенте и на сервере. Ничего лучше fetch вы не придумаете.»
  • 🎓 HTTP requests in browser and Node.js: XMLHttpRequest, fetch · 2019-03-21

    • Тезисы: исторически писали полифил fetch поверх http.get; контракт одинаков между клиентом и сервером; переносимость кода — главное преимущество.

См. также