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; контракт одинаков между клиентом и сервером; переносимость кода — главное преимущество.
- Тезисы: исторически писали полифил fetch поверх