Node fetch принципы работы и примеры использования

Node fetch что это

Node fetch что это

Node fetch – это модуль для Node.js, который позволяет отправлять HTTP-запросы и получать ответы в формате, близком к стандарту fetch в браузерах. Он поддерживает промисы, что упрощает обработку асинхронных операций, и позволяет работать с REST API без использования дополнительных библиотек.

Для установки достаточно выполнить команду npm install node-fetch. После подключения модуля можно сразу отправлять запросы методом fetch(url, options), где options включают метод запроса, заголовки и тело. Node fetch автоматически обрабатывает JSON, но также поддерживает текст, буферы и потоки.

Особенность Node fetch в том, что он не встроен в ядро Node.js, поэтому каждый проект должен явно подключать пакет. При работе с большими данными рекомендуется использовать потоковую обработку через response.body, чтобы снизить потребление памяти. Для управления ошибками можно применять блоки try/catch и проверку статуса ответа через response.ok.

Node fetch позволяет отправлять как одиночные, так и параллельные запросы. Для параллельных операций удобно использовать Promise.all, что ускоряет обработку нескольких API-запросов одновременно. Также можно задавать заголовки авторизации и кастомные таймауты для повышения контроля над сетевыми операциями.

Node fetch: принципы работы и примеры использования

Node fetch: принципы работы и примеры использования

Node fetch реализует стандарт fetch API для Node.js, используя промисы для асинхронной обработки HTTP-запросов. Запрос формируется функцией fetch(url, options), где options может включать метод (GET, POST, PUT, DELETE), заголовки, тело запроса и настройки таймаута.

Ответы от сервера доступны через промис, который возвращает объект Response. Для получения JSON применяется response.json(), для текста – response.text(), для потоков больших данных – response.body. Проверка успешности запроса осуществляется через response.ok и response.status.

Пример GET-запроса: fetch(‘https://api.example.com/data’).then(res => res.json()).then(data => console.log(data)). Для POST-запроса с JSON-телом используется: fetch(url, {method: ‘POST’, headers: {‘Content-Type’: ‘application/json’}, body: JSON.stringify(payload)}).

Для обработки ошибок рекомендуется использовать try/catch с асинхронной функцией. Параллельные запросы можно объединять через Promise.all, что позволяет одновременно получать данные из нескольких источников. Таймауты и управление потоками данных помогают контролировать производительность при работе с крупными ответами.

Как установить и подключить node-fetch в проект

Как установить и подключить node-fetch в проект

Для использования node-fetch в Node.js необходимо установить пакет через npm или yarn. Рекомендуется использовать актуальную версию Node.js (18 и выше) для совместимости с последними возможностями fetch.

  1. Установка через npm: npm install node-fetch
  2. Установка через yarn: yarn add node-fetch

После установки модуль подключается в проекте с помощью функции require или синтаксиса ES Modules:

  • CommonJS: const fetch = require(‘node-fetch’);
  • ESM: import fetch from ‘node-fetch’;

Рекомендуется проверять версию пакета после установки с помощью команды npm list node-fetch для контроля совместимости с другими зависимостями.

При работе с TypeScript стоит установить типы отдельно: npm install —save-dev @types/node-fetch. Это позволяет использовать автодополнение и проверку типов при написании запросов.

Разница между fetch в Node.js и браузере

Разница между fetch в Node.js и браузере

В браузере fetch встроен в среду выполнения, поэтому не требует дополнительных библиотек. В Node.js для fetch необходимо использовать сторонний модуль, например node-fetch. Это связано с отсутствием стандартного объекта window и встроенных сетевых API.

Node-fetch предоставляет аналогичный интерфейс, но отличается обработкой потоков и буферов. В браузере response.body возвращает ReadableStream, совместимый с Web Streams API, тогда как в Node.js это Node Stream, который требует методов pipe или on(‘data’) для чтения данных.

В браузере автоматически учитываются куки и CORS-политики. В Node.js разработчик должен самостоятельно управлять заголовками, куки и авторизацией, передавая их в options.headers. Также Node.js не накладывает ограничений на количество параллельных запросов, в отличие от браузеров, где есть лимиты на одновременные соединения с одним доменом.

Для тестирования и разработки в Node.js рекомендуется использовать node-fetch совместно с пакетами для управления потоками и таймаутами, чтобы добиться поведения, близкого к браузерному fetch, особенно при работе с большими JSON-ответами или бинарными данными.

Отправка GET-запросов и обработка ответов

GET-запросы в node-fetch выполняются вызовом fetch(url), где url указывает конечную точку API. По умолчанию метод запроса – GET, поэтому дополнительные параметры не обязательны, если не требуется передать заголовки.

Обработка ответа включает проверку статуса и преобразование данных в нужный формат:

  1. Проверка успешности: response.ok или response.status для точного контроля кодов ответа.
  2. Получение JSON: const data = await response.json();
  3. Получение текста: const text = await response.text();
  4. Работа с потоками: response.body.on(‘data’, chunk => { … }) для больших файлов.

Для добавления заголовков используется объект options: fetch(url, { headers: { ‘Accept’: ‘application/json’ } }). Это полезно для API, требующих токены или специальные параметры.

Рекомендуется оборачивать GET-запросы в try/catch для отлавливания сетевых ошибок и таймаутов. Для параллельных запросов к нескольким ресурсам удобно использовать Promise.all, что позволяет получить все ответы одновременно и ускоряет обработку данных.

Работа с POST-запросами и отправка данных

POST-запросы в node-fetch применяются для отправки данных на сервер. Метод запроса указывается в объекте options через method: ‘POST’. Данные можно передавать в формате JSON, формы или буфера.

Пример структуры POST-запроса:

Элемент Описание
url Конечная точка API, например ‘https://api.example.com/create’
method ‘POST’ – указывает тип запроса
headers { ‘Content-Type’: ‘application/json’ } для JSON или ‘application/x-www-form-urlencoded’ для формы
body Данные в виде JSON.stringify(obj) или URLSearchParams для формы

Для обработки ответа используется response.json() или response.text(). Рекомендуется проверять response.ok для контроля успешности запроса и использовать try/catch для отлавливания ошибок сети или некорректных ответов.

При отправке больших данных следует учитывать лимиты сервера и использовать потоковую передачу через ReadableStream, чтобы избежать переполнения памяти и задержек в обработке.

Обработка ошибок и управление таймаутами

Обработка ошибок и управление таймаутами

Node fetch не выбрасывает ошибку при HTTP-статусах 4xx или 5xx. Для контроля успешности запроса необходимо проверять response.ok и response.status. Пример проверки:

if (!response.ok) throw new Error(`Ошибка ${response.status}: ${response.statusText}`);

Для управления таймаутами используется объект AbortController. Создается контроллер, передается сигнал в fetch и задается таймаут через setTimeout:

const controller = new AbortController();

const timeout = setTimeout(() => controller.abort(), 5000);

try {

  const response = await fetch(url, { signal: controller.signal });

  const data = await response.json();

} catch (err) {

  if (err.name === ‘AbortError’) console.log(‘Запрос прерван по таймауту’);

  else console.error(‘Сетевая ошибка:’, err);

} finally {

  clearTimeout(timeout);

}

Для параллельных запросов рекомендуется отдельный контроллер на каждый fetch, чтобы прерывание одного запроса не влияло на остальные. Это повышает устойчивость приложения к долгим или зависшим запросам.

Использование заголовков и авторизации в запросах

Node fetch позволяет задавать заголовки через объект options.headers. Это необходимо для передачи типа контента, токенов авторизации или пользовательских параметров. Пример базового заголовка:

fetch(url, { headers: { ‘Content-Type’: ‘application/json’ } })

Для авторизации с токеном используется заголовок Authorization:

fetch(url, { headers: { ‘Authorization’: ‘Bearer YOUR_TOKEN’ } })

При работе с API, требующими ключи, рекомендуется хранить их в переменных окружения и не включать в код напрямую. Это предотвращает утечку данных при публикации проекта.

Можно комбинировать несколько заголовков, например Content-Type, Authorization и Accept:

fetch(url, {

  method: ‘POST’,

  headers: {

    ‘Content-Type’: ‘application/json’,

    ‘Authorization’: ‘Bearer TOKEN’,

    ‘Accept’: ‘application/json’

  },

  body: JSON.stringify(payload)

})

Рекомендуется проверять документацию API на обязательные заголовки и форматы данных, чтобы избежать ошибок 401 или 415 при отправке запросов.

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

Последовательные запросы выполняются один за другим, что полезно, когда результат одного запроса нужен для следующего. Пример:

const data1 = await fetch(‘https://api.example.com/first’).then(res => res.json());

const data2 = await fetch(`https://api.example.com/second?id=${data1.id}`).then(res => res.json());

console.log(data1, data2);

Параллельные запросы позволяют одновременно получать данные из нескольких источников, что ускоряет обработку. Для этого используется Promise.all:

const urls = [‘https://api.example.com/first’, ‘https://api.example.com/second’, ‘https://api.example.com/third’];

const responses = await Promise.all(urls.map(url => fetch(url).then(res => res.json())));

console.log(responses);

При параллельных запросах важно учитывать лимиты API и нагрузку на сеть. Для контроля ошибок лучше использовать Promise.allSettled, чтобы получить результаты всех запросов, включая те, которые завершились с ошибкой.

Для больших объемов данных и длительных операций рекомендуется комбинировать параллельные и последовательные подходы, распределяя критические запросы по зависимостям и одновременно обрабатывая независимые.

Вопрос-ответ:

В чем отличие fetch в Node.js от встроенного fetch в браузере?

В браузере fetch встроен в среду и автоматически обрабатывает куки, CORS и кеширование. В Node.js fetch отсутствует в ядре, поэтому используется модуль node-fetch. При этом управление заголовками, авторизацией и потоками данных полностью ложится на разработчика, а чтение больших ответов требует использования Node Stream через response.body.

Как правильно обрабатывать ошибки при использовании node-fetch?

Node-fetch не выбрасывает исключение при HTTP-кодах 4xx или 5xx. Для проверки успешности запроса нужно использовать response.ok и response.status. Сетевые ошибки и таймауты перехватываются через try/catch. Для управления таймаутами применяется AbortController, позволяющий прерывать запрос через заданное время и предотвращать зависания приложения.

Как отправлять данные через POST-запросы с node-fetch?

POST-запросы выполняются с указанием метода ‘POST’ в options. Данные передаются в body, чаще всего в формате JSON через JSON.stringify(obj). Заголовок Content-Type должен соответствовать формату данных, например ‘application/json’ для JSON или ‘application/x-www-form-urlencoded’ для формы. После отправки рекомендуется проверять response.ok и преобразовывать ответ в нужный формат с помощью response.json() или response.text().

Можно ли выполнять несколько запросов параллельно и как обрабатывать их результаты?

Да, параллельные запросы выполняются через Promise.all или Promise.allSettled. Promise.all возвращает массив результатов только если все запросы завершились успешно, а Promise.allSettled позволяет получить статус каждого запроса отдельно, включая ошибки. Такой подход ускоряет получение данных из нескольких API и помогает корректно обрабатывать неудачные ответы без прерывания остальных операций.

Как правильно использовать заголовки и авторизацию в node-fetch?

Заголовки передаются через options.headers. Для авторизации часто используют Authorization с токеном: ‘Bearer YOUR_TOKEN’. Можно одновременно задавать Content-Type, Accept и другие кастомные заголовки. Рекомендуется хранить токены в переменных окружения и проверять документацию API на обязательные заголовки, чтобы избежать ошибок 401 или 415 при отправке запроса.

Как правильно использовать node-fetch для загрузки больших файлов без переполнения памяти?

При работе с большими файлами важно не загружать весь ответ сразу через response.json() или response.text(), так как это может привести к переполнению памяти. Вместо этого следует использовать потоковую обработку через response.body, которая возвращает Node Stream. Данные можно читать по частям с помощью событий ‘data’ и ‘end’, либо передавать поток дальше через pipe в файловый поток. Также рекомендуется использовать AbortController для ограничения времени загрузки и контролировать сетевые ошибки через try/catch.

Ссылка на основную публикацию