Серія Node.js: 4 прості методи для виконання асинхронних HTTP запитів

текст перекладу
pic

При написанні коду існує одна проблема, яку майже неможливо уникнути: велика кількість HTTP запитів! Кожного разу, коли нам потрібно отримати доступ до будь-якого віддаленого ресурсу (API, веб-сторінка, файл тощо), ми покладаємося на ці запити. Тож, які модулі доступні в Node.js для цього? Давайте дізнаємось!

Для простоти і легкості розуміння всі приклади в цій статті будуть використовувати GET запити.

Ви дізнаєтесь:

  • Як здійснювати HTTP запити з використанням різних модулів
  • Переваги та недоліки кожного модуля

Вимоги для читання:

  • Рекомендується мати базове розуміння JavaScript і синтаксису ES6.
  • У вас має бути встановлений Node.js версії 7.6.0 або вищої.

Налаштування проекту

  1. Створіть порожню папку та ініціалізуйте її за допомогою npm:
mkdir test && cd $_  
npm init -y
  1. Node.js пропонує два простих шаблони для виконання HTTP запитів:
  • Класичний шаблон з використанням зворотних викликів
    (Перевантаження цього шаблону може призвести до знаменитого "пекла зворотних викликів", що дуже важко підтримувати!)
  • Підтримка Promise, яка дозволяє використовувати async/await
    (Promises є основною концепцією—якщо ви з ними не знайомі, ознайомтесь з посиланням нижче, щоб дізнатись більше.)

[

JavaScript Promise:簡介 | Articles | web.dev

Promise 可簡化延遲與非同步的運算作業。承諾代表的是尚未完成的作業。

web.dev

](https://web.dev/articles/promises?hl=zh-tw&source=post_page-----7ff9a887ff56--------------------------------)

pic

Розпочнемо з зворотного виклику!

  1. http.get та https.get
    Перший варіант—вбудовані методи Node.js http.get і https.get. Якщо вам потрібно лише зробити дуже прості GET запити, вони підійдуть.

Переваги

  • Вбудований API; не потрібно встановлювати додаткові модулі
  • Відповідь є потоком, що може вимагати більшої ручної обробки
    (Цей пункт може бути як перевагою, так і недоліком. З одного боку, це чудовий спосіб краще зрозуміти потоки!)

Недоліки

  • Можливо, вам доведеться написати більше коду, що ускладнить підтримку в довгостроковій перспективі
  • Те саме, що й у другому пункті (ручне управління потоками)
  • Відсутня нативна підтримка Promise

Приклад http-native.js

const https = require("https");  
const url = "https://api.jasontechlab.com/posts/1";  

https.get(url, res => {  
 res.setEncoding("utf8");  
 let body = "";  

 res.on("data", data => {  
 body += data;  
 });  

 res.on("end", () => {  
 body = JSON.parse(body);  
 console.log(body);  
 });  
});

Тепер давайте виконаємо наступний код:

node http-native.js

Результат:

{  
 "userId": 1,  
 "id": 1,  
 "title": "delectus aut autem",  
 "completed": false  
}

У http.get перший параметр—це URL, а другий параметр—це зворотний виклик res. Тут res є об'єктом http.ClientRequest, що означає, що якщо ви хочете маніпулювати тілом відповіді, вам потрібно слухати певні події. Подивіться на частину res.on() в прикладі.

У наведеному прикладі я просто використовую console.log, щоб вивести дані, що повертаються від API. У реальному світі ви, ймовірно, маєте складніші операції або передаєте дані в іншу функцію зворотного виклику:

function makeResponseHandler (callback) {  
 return function (response) {  
 //обробляємо дані, рідний спосіб node.js  
 callback(null, result);  
 }  
};  

return {  
 apiGet: function(url, callback) {  
 http.get(url, makeResponseHandler(callback));  
 }  
}

Резюме:
Існує також модуль request для шаблону зворотного виклику, але він застарілий. Якщо вам цікаво, ви можете перевірити офіційний сайт для детальнішої інформації:

[

request

Спрощений клієнт HTTP запитів.. Остання версія: 2.88.2, останнє опублікування: 5 років тому. Почніть використовувати request у вашому…

www.npmjs.com

](https://www.npmjs.com/package/request?source=post_page-----7ff9a887ff56--------------------------------)

Хоча використання рідних методів може призвести до написання більше коду, вам доведеться обробляти рідні події.
текст перекладу
Це означає, що потрібно глибше зануритися в інтерни Node.js, що, на мою думку, корисно — тому я рекомендую цей підхід для початківців!

Далі можна підсумувати в одному реченні: Обіцяю, я буду асинхронним!

2. node-fetch

node-fetch — це реалізація Fetch API в Node.js. Вона фактично така ж, як і window.fetch, що робить її дуже інтуїтивною для використання.

Переваги

  • Підтримує Promises
  • Використання дуже схоже на window.fetch
  • Має небагато залежностей

Недоліки

  • Не підтримує синхронні запити
  • Викидає помилки лише для мережевих проблем; статус коди типу 400 або 500 трактуються як успішні відповіді, тому вам потрібно обробляти їх самостійно
  • За замовчуванням не відправляє cookies — для цього потрібна додаткова конфігурація
  • Не підтримує аборт або вбудоване управління тайм-аутами. Використання setTimeout і Promise.reject для тайм-аутів не зупинить підготовку запиту в фоні, що може призвести до зайвого мережевого трафіку
  • Немає вбудованого способу моніторингу прогресу запиту

Встановлення:

npm i node-fetch --save

Приклад node-fetch.js

const fetch = require("node-fetch");  
const url = "https://jsonplaceholder.typicode.com/posts/1";  

const getData = async url => {  
 try {  
 const response = await fetch(url);  
 const json = await response.json();  
 console.log(json);  
 } catch (error) {  
 console.log(error);  
 }  
};  

getData(url);

Запустіть:

node node-fetch.js

Резюме:

Особисто мені не подобається використовувати node-fetch, в основному тому, що я не великий прихильник Fetch API.

Мені здається важким викликати json() і ланцюжити два then() виклики. Але кожен має свої уподобання, і найголовніше — вибрати те, що підходить вам.

3. r2

Автор модуля request створив r2 в 2017 році, і його можна вважати ще однією реалізацією Fetch API. Це означає, що r2 побудовано на основі node-fetch.

Він має такі ж переваги і недоліки, як і node-fetch.

Встановлення:

npm i r2

Приклад r2.js :

const r2 = require("r2");  
const url = "https://jsonplaceholder.typicode.com/posts/1";  

const getData = async url => {  
 try {  
 const response = await r2(url).json;  
 console.log(response);  
 } catch (error) {  
 console.log(error);  
 }  
};  

getData(url);

Запуск:

node r2.js

Резюме:

Я визнаю, що не приділяв багато часу вивченню цього (в основному через те, що я вже маю упередження проти node-fetch). Однак, якщо вам цікаво, ви можете ознайомитися з його новими можливостями і покращеннями — можливо, вам сподобається.

4. axios

Axios — це зараз надзвичайно популярний модуль, і це також той, який я використовую найчастіше. Він має нативну підтримку Promises, що робить код дуже лаконічним.

Axios можна використовувати як на фронтенді, так і на бекенді, і він автоматично перетворює відповідь — не потрібно викликати json(), як це потрібно з node-fetch!

Переваги

  • Підтримує Promises
  • Дуже простий і зручний у використанні
  • Лише дві залежності

Недоліки

  • ??? (Якщо ви знаєте які-небудь, не соромтесь повідомити мені!)

Встановлення:

npm i axios

Приклад axios-module.js

const axios = require("axios");  
const url = "https://jsonplaceholder.typicode.com/posts/1";  

const getData = async url => {  
 try {  
 const response = await axios.get(url);  
 const data = response.data;  
 console.log(data);  
 } catch (error) {  
 console.log(error);  
 }  
};  

getData(url);

Запуск:

node axios-module.js

Резюме:
На даний момент я не знайшов багато недоліків у Axios — він так простий у використанні і налаштуванні. Можливо, коли технологія Fetch стане достатньо зрілою, щоб повністю замінити AJAX, ми знайдемо кілька причин більше не використовувати Axios.

Висновок:
З простого порівняння ви можете спробувати всі варіанти. На даний момент Axios все ще є моїм головним вибором.
текст перекладу
Я також стежу за новачком під назвою bent, який здається ще лаконічнішим за Axios — не соромтесь перевірити його:

[

GitHub - mikeal/bent: Функціональний JS HTTP клієнт (Node.js & Fetch) з async await

Функціональний JS HTTP клієнт (Node.js & Fetch) з async await - mikeal/bent

github.com

](https://github.com/mikeal/bent?source=post_page-----7ff9a887ff56--------------------------------)

Це все для цього посту — сподіваюся, він був корисним!

Перекладено з: Node.js Series: 4 Simple Methods to Make Asynchronous HTTP Requests

Leave a Reply

Your email address will not be published. Required fields are marked *