текст перекладу
При написанні коду існує одна проблема, яку майже неможливо уникнути: велика кількість HTTP запитів! Кожного разу, коли нам потрібно отримати доступ до будь-якого віддаленого ресурсу (API, веб-сторінка, файл тощо), ми покладаємося на ці запити. Тож, які модулі доступні в Node.js для цього? Давайте дізнаємось!
Для простоти і легкості розуміння всі приклади в цій статті будуть використовувати GET запити.
Ви дізнаєтесь:
- Як здійснювати HTTP запити з використанням різних модулів
- Переваги та недоліки кожного модуля
Вимоги для читання:
- Рекомендується мати базове розуміння JavaScript і синтаксису ES6.
- У вас має бути встановлений Node.js версії 7.6.0 або вищої.
Налаштування проекту
- Створіть порожню папку та ініціалізуйте її за допомогою npm:
mkdir test && cd $_
npm init -y
- 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--------------------------------)
Розпочнемо з зворотного виклику!
http.get
таhttps.get
Перший варіант—вбудовані методи Node.jshttp.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