Створення веб-сервера HTTP в Node.js за допомогою Code Приклад

⚡ Розумний підсумок

Node.js створює робочий вебсервер за кілька рядків, використовуючи вбудований http-модуль. Сервер прослуховує вибраний порт і відповідає на кожен запит кодом стану та тілом запиту, тоді як окремий код отримує дані з інших сайтів.

  • 🖥️ Створення сервера: http.createServer реєструє зворотний виклик, який виконується один раз на кожен вхідний запит та отримує об'єкти запиту та відповіді.
  • 🔢 Стан і заголовки: writeHead надсилає код стану та Content-Type перед тим, як буде записано будь-який вміст тіла.
  • 🔌 Прив'язка порту: server.listen підключає програму до порту, і можна вибрати будь-який вільний номер порту.
  • 📥 Вихідні запити: Для отримання даних з іншого сайту потрібен HTTP-клієнт, і Node тепер постачає глобальну функцію отримання.
  • ⚠️ Застарілий клієнт: Модуль запиту було вилучено з лютого 2020 року та не повинен використовуватися в новому коді.
  • 🛠️ Збої запуску: Помилка EADDRINUSE означає, що вибраний порт вже зайнятий іншим процесом.

Створіть веб-сервер HTTP в Node.js

Команда Node.js Фреймворк здебільшого використовується для створення серверних застосунків. Його можна легко використовувати для створення вебсерверів, які надають контент користувачам.

Кілька модулів обробляють запити, пов'язані з сервером, вбудований http головний модуль серед них. Ми розглянемо, як створити базовий веб-серверний застосунок за допомогою Node.js, а потім як запитувати дані з іншого сайту.

Вузол як веб-сервер за допомогою HTTP

Давайте розглянемо приклад того, як створити та запустити перший застосунок Node.js.

Програма створює простий серверний модуль, який прослуховує порт 7000. Коли через браузер на цьому порту надсилається запит, сервер надсилає Привіт світ відповідь клієнту.

Вузол як веб-сервер за допомогою HTTP

Code Пояснення

  1. Команда require функція читає a JavaScript файл, виконує його та повертає його об'єкт exports. Тут він завантажує http модуль, щоб його функціональність була доступна в застосунку.
  2. Серверний застосунок створюється з простої функції. Ця функція виконується щоразу, коли запит надходить до сервера.
  3. Коли запит отримано, відповідь надсилається зі статусом 200Це стандартний код стану в HTTP-заголовку для успішної відповіді.
  4. Тіло відповіді саме по собі є рядком Привіт світ.
  5. server.listen змушує програму прослуховувати запити клієнтів на порту 7000. Можна використовувати будь-який доступний порт.

Якщо команда виконана успішно, у браузері з’явиться наступний вивід.

Вихід

Вивід веб-сервера вузла

З виводу:

  • Перегляд локального хоста URL на порту 7000 відображається рядок Привіт світ на сторінці.
  • Оскільки в коді вказано порт 7000, вивід видно лише під час перегляду цього порту.

Ось код для довідки:

var http = require('http');

var server = http.createServer(function(request, response) {
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.end("Hello World\n");
});

server.listen(7000);

Обробка запитів GET у Node.js

Здійснення GET-запиту для отримання даних з іншого сайту в Node.js є простим. Історично для цього було потрібно request модуль, встановлений з командного рядка:

npm install request

Ця команда просить менеджер пакетів Node завантажити потрібний модуль та встановити його. Після успішного встановлення командний рядок відображає назву та версію встановленого модуля у форматі <name>@<version>.

Вивід запиту на встановлення npm

На знімку вище, request Модуль та його номер версії були завантажені та встановлені.

Створення GET-запиту в Node.js

Code Пояснення

  1. Команда request Модуль, встановлений на попередньому кроці, надає функції, необхідні для здійснення GET-запитів до вебсайтів.
  2. До сайту надсилається GET-запит, і зворотний виклик виконується після отримання відповіді. Зворотний виклик отримує три параметри:
    1. помилка — фіксує будь-які помилки, що виникли під час подання запиту.
    2. відповідь — містить HTTP-заголовки, що повертаються разом із відповіддю.
    3. Body — містить весь зміст відповіді.
  3. Контент, отриманий у body параметр записується в консоль.

Ось код для довідки:

var request = require("request");

request("https://example.com", function(error, response, body) {
    // Always check the error parameter before using the body
    if (error) {
        console.error("Request failed:", error.message);
        return;
    }
    console.log(body);
});

⚠️ Повідомлення про припинення підтримки: request модуль був повністю застаріло у лютому 2020 року і не отримує подальших оновлень. Він все одно встановлюється та працює, тому наведений вище приклад залишається дійсним для існуючих проектів, але npm install request тепер виводить попередження про застарівання. Новий код має використовувати вбудований fetch функція, показана в наступному розділі.

Як робити HTTP-запити за допомогою нативного fetch у Node.js

Вузол включив глобальний fetch функція починаючи з версії 18, що відповідає API, які вже надають браузери. Встановлення пакета не потрібне, а функція повертає обіцянку, тому вона працює безпосередньо з async/await.

// No require and no npm install needed on Node 18 or later

async function getData() {
    try {
        const response = await fetch("https://example.com");

        // fetch does NOT reject on 404 or 500 — check ok yourself
        if (!response.ok) {
            throw new Error("HTTP status " + response.status);
        }

        const body = await response.text();
        console.log(body);

    } catch (err) {
        // Network failures and the throw above both land here
        console.error("Request failed:", err.message);
    }
}

getData();

Варто зазначити три відмінності від стилю зворотного виклику. По-перше, fetch відхиляє лише у разі збою на рівні мережі; HTTP 404 або 500 все одно успішно вирішується, тому response.ok перевірка існує та чому її пропуск є найпоширенішою помилкою при переході з requestПо-друге, тіло запиту не доставляється разом із відповіддю — його потрібно явно зчитувати разом із response.text() для звичайного тексту або response.json() для JSON, і кожен з них повертає власну обіцянку. По-третє, оскільки весь виклик базується на обіцянці, єдиний try/catch охоплює як запит, так і зчитування тіла, повністю замінюючи параметр зворотного виклику error-first.

Для скриптів, які мають працювати на Node 16 або ранішій версії, встановіть node-fetch or axios натомість, оскільки обидва надають порівнянний інтерфейс на основі обіцянок і вимагають лише зміни рядка імпорту після оновлення середовища виконання.

запит проти вибору проти аксіом: що використовувати

У більшості матеріалів Node зустрічаються три HTTP-клієнти, і лише один з них є розумним стандартним для нової роботи. Вони відрізняються статусом обслуговування, тим, чи потрібна взагалі залежність, і тим, як кожен з них сигналізує про статус помилки, тому в таблиці нижче вони розташовані поруч.

Аспект запросити вибірка (вбудована) аксіоси
Статус Застаріло з 2020 року Зберігається в ядрі Активно обслуговується
Встановлення пакет npm Немає на Node 18+ пакет npm
стиль Зворотний виклик з першою помилкою Обіцянка Обіцянка
Розбір JSON Вручну або у форматі JSON Вручну через response.json() автоматичний
Відхилення на 404 або 500 Немає Немає Так

Скористайтеся кнопкою fetch для нових проектів у поточній версії Node, оскільки це не додає залежностей та відповідає вже відомому розробникам API браузера. Виберіть axios коли автоматична обробка JSON, перехоплювачі запитів або відхилення у разі помилок рятували б реальний код. Зберегти request лише всередині застарілих програм, які вже залежать від нього та планують його замінити.

Поширені помилки сервера Node.js та як їх виправити

Більшість збоїв під час запуску першого Node-сервера виникають через порти, шляхи або відсутність відповіді, а не через сам код сервера.

  • ЕАДДРІНЮЗ: інший процес вже займає порт. Запустіть netstat -ano | findstr :7000 on Windowsабо lsof -i :7000 on macOS і Linux, потім зупиніть цей процес або виберіть інший порт.
  • EACCES на низькому порту: Порти нижче 1024 потребують підвищених прав. Під час розробки використовуйте порт вище 1024, наприклад, 3000 або 7000.
  • Браузер зависає і ніколи не завантажується: обробник ніколи не телефонував response.end()З'єднання залишається відкритим до закінчення часу очікування, тому кожен шлях через обробник має завершувати відповідь.
  • Не вдається знайти модуль 'http': ім'я файлу було написано з помилкою, або скрипт працює в браузері, а не в Node. Модулі Core не потребують встановлення.
  • Зміни не відображаються: Node завантажує файл один раз під час запуску. Перезапускайте процес після кожного редагування або запускайте його під спостереженням, таким як node --watch server.js.

Поширені запитання

Модуля http достатньо для однієї кінцевої точки. Express додає маршрутизацію, проміжне програмне забезпечення та парсинг тіла, залежність від яких стає виправданою, коли програма обслуговує кілька маршрутів.

Вимагати https модуль замість цього та передайте ключ і сертифікат до createServer. У продакшені зворотний проксі-сервер, такий як Nginx, зазвичай завершує TLS та пересилає звичайний HTTP до Node.

Так. AI Інструменти надійно конвертують зворотні виклики, що передбачають помилку, в асинхронні очікування. Перевірте, чи згенерований код додає тест response.ok, оскільки fetch вирішується на 404, а ця перевірка часто пропускається.

Помічники штучного інтелекту зчитують код помилки та безпосередньо називають причину, відрізняючи конфлікт портів від проблеми з дозволами або синтаксичної помилки, що значно скорочує час здогадок у першому проекті Node.

Об'єкт запиту є потоком, тому збирайте його дані подій у буфер і аналізуйте результат на кінцевій події. Express та подібні фреймворки надають проміжне програмне забезпечення для аналізу тіла, яке виконує цей крок за вас.

Підсумуйте цей пост за допомогою: