HTTP-клиент для JavaScript (Node.js): топ библиотек для работы с сетью
В современной веб-разработке на Node.js отправка HTTP-запросов — одна из самых частых операций. Будь то обращение к REST API, загрузка файлов или взаимодействие с микросервисами — без надежного HTTP-клиента не обойтись. В этой статье мы подробно разберем четыре лучшие библиотеки для JavaScript (Node.js): Axios, Got, node-fetch и undici. Вы узнаете их особенности, производительность и получите готовые примеры кода.
1. Axios — универсальный стандарт
Axios — самый популярный HTTP-клиент для Node.js и браузеров. Он построен на Promise и поддерживает перехватчики (interceptors), автоматический парсинг JSON, защиту от CSRF и отмену запросов.
Установка:
npm install axios
Пример GET-запроса:
const axios = require('axios');
async function getUser(id) {
try {
const response = await axios.get(`https://api.example.com/users/${id}`);
console.log(response.data);
} catch (error) {
console.error('Ошибка:', error.message);
}
}
getUser(1);
Пример POST с заголовками:
const axios = require('axios');
const data = { name: 'Alice', role: 'developer' };
axios.post('https://api.example.com/users', data, {
headers: { 'Content-Type': 'application/json' }
}).then(res => console.log(res.status));
Плюсы: простота, обширная экосистема, поддержка прогресса загрузки.
Минусы: размер пакета (~100 КБ), избыточность для простых задач.
2. Got — быстрый и функциональный
Got — легковесный HTTP-клиент с богатым API. Он поддерживает потоковую передачу, кэширование, повторные попытки и работает быстрее Axios.
Установка:
npm install got
Пример с потоком и обработкой ошибок:
const got = require('got');
const fs = require('fs');
async function downloadFile(url, outputPath) {
try {
const stream = got.stream(url);
const fileStream = fs.createWriteStream(outputPath);
stream.pipe(fileStream);
await new Promise((resolve, reject) => {
stream.on('end', resolve);
stream.on('error', reject);
});
console.log('Файл загружен');
} catch (error) {
console.error('Ошибка загрузки:', error.message);
}
}
downloadFile('https://example.com/file.zip', './file.zip');
Пример с повторными попытками:
const got = require('got');
got('https://api.example.com/data', {
retry: { limit: 3, methods: ['GET'] }
}).then(response => console.log(response.body));
Плюсы: малый размер, скорость, встроенные ретраи.
Минусы: менее интуитивный API для новичков.
3. node-fetch — знакомый синтаксис из браузера
node-fetch — порт браузерного Fetch API для Node.js. Идеален, если вы привыкли к fetch в браузере и хотите единообразный код.
Установка:
npm install node-fetch
Пример с async/await:
const fetch = require('node-fetch');
async function getPosts() {
const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
if (!response.ok) throw new Error('HTTP error ' + response.status);
const data = await response.json();
console.log(data.title);
}
getPosts();
Пример отправки FormData:
const fetch = require('node-fetch');
const FormData = require('form-data');
const form = new FormData();
form.append('file', fs.createReadStream('./photo.jpg'));
fetch('https://api.example.com/upload', {
method: 'POST',
body: form
}).then(res => console.log(res.status));
Плюсы: нативный синтаксис, легкий, хорош для миграции с браузера.
Минусы: нет встроенных таймаутов, нужно добавлять abort-controller.
4. undici — максимальная производительность
undici — современный HTTP-клиент от команды Node.js, написанный на C++ для максимальной скорости. Рекомендуется для высоконагруженных систем.
Установка:
npm install undici
Пример базового запроса:
const { request } = require('undici');
async function fetch