Создайте HTTP-веб-сервер в Node.js с помощью Code Пример

⚡ Умное резюме

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

  • 🖥️ Создание сервера: Метод http.createServer регистрирует функцию обратного вызова, которая выполняется один раз для каждого входящего запроса и получает объекты запроса и ответа.
  • 🔢 Статус и заголовки: Функция writeHead отправляет код состояния и Content-Type до того, как будет записано какое-либо содержимое тела запроса.
  • ???? Привязка порта: Функция server.listen подключает приложение к порту, и можно выбрать любой свободный номер порта.
  • 📥 Исходящие запросы: Для получения данных с другого сайта необходим HTTP-клиент, и Node теперь предоставляет глобальную функцию fetch.
  • ⚠️ Устаревший клиент: Модуль запросов был объявлен устаревшим в феврале 2020 года и не должен использоваться в новом коде.
  • 🇧🇷 Ошибки при запуске: Ошибка EADDRINUSE означает, что выбранный порт уже занят другим процессом.

Создайте веб-сервер HTTP в Node.js

Node.js Этот фреймворк в основном используется для создания серверных приложений. Его легко можно использовать для построения веб-серверов, которые предоставляют контент пользователям.

Несколько модулей обрабатывают запросы, связанные с сервером, встроенные модули... http В первую очередь, это модуль. Мы рассмотрим, как создать базовое веб-серверное приложение с использованием Node.js, а затем как запрашивать данные с другого сайта.

Node как веб-сервер с использованием HTTP

Рассмотрим пример создания и запуска первого приложения Node.js.

Приложение создает простой серверный модуль, который прослушивает порт 7000. Когда через браузер поступает запрос на этот порт, сервер отправляет сообщение. Привет мир ответ клиенту.

Node как веб-сервер с использованием HTTP

Code объяснение

  1. require функция считывает JavaСценарий файл, выполняет его и возвращает объект экспорта. Здесь он загружает http модуль, чтобы его функциональность была доступна в приложении.
  2. Серверное приложение создаётся из простой функции. Эта функция выполняется каждый раз, когда запрос поступает на сервер.
  3. При получении запроса отправляется ответ со статусом 200Это стандартный код состояния в заголовке HTTP, указывающий на успешный ответ.
  4. Тело ответа представляет собой строку. Привет мир.
  5. server.listen Это заставляет приложение принимать запросы от клиентов на порту 7000. Можно использовать любой доступный порт.

Если команда выполнится успешно, в браузере отобразится следующий результат.

Результат

Вывод веб-сервера Node

Из выходных данных:

  • Переход по ссылке localhost 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

В Node.js легко выполнить GET-запрос для получения данных с другого сайта. Исторически для этого требовалось... request Модуль, установленный из командной строки:

npm install request

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

вывод запроса npm install

На приведенном выше снимке показано request Модуль и номер его версии были загружены и установлены.

Выполнение GET-запроса в Node.js

Code объяснение

  1. request Модуль, установленный на предыдущем шаге, предоставляет функции, необходимые для выполнения GET-запросов к веб-сайтам.
  2. К сайту отправляется GET-запрос, и после получения ответа запускается функция обратного вызова. Функция обратного вызова принимает три параметра:
    1. Ошибка — регистрирует любые ошибки, возникшие при отправке запроса.
    2. Режимы секции мощности — содержит заголовки HTTP, возвращаемые вместе с ответом.
    3. Тело — содержит полное содержание ответа.
  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 охватывает как запрос, так и тело запроса, полностью заменяя параметр обратного вызова, который обрабатывается при первой ошибке.

Для скриптов, которые должны работать на Node 16 или более ранних версиях, установите... node-fetch or axios Вместо этого, поскольку оба варианта предоставляют сопоставимый интерфейс на основе промисов и требуют лишь изменения строки импорта после обновления среды выполнения.

request, fetch или xios: что использовать?

В большинстве материалов по Node.js встречаются три HTTP-клиента, и только один из них является разумным вариантом по умолчанию для новых проектов. Они различаются по статусу поддержки, по необходимости наличия зависимости и по способу оповещения об ошибках, поэтому в таблице ниже они представлены рядом.

Аспект запросить fetch (встроенная функция) Вардар
Статус Устарело с 2020 года Поддерживается в ядре Активно поддерживается
Установка пакет npm Нет на узле 18+ пакет npm
Стиль Обратный вызов с обработкой ошибки в первую очередь Обещание Обещание
Анализ JSON Вручную или в формате JSON. Вручную через response.json() Автоматический
Отклоняется при ошибках 404 или 500. Нет Нет Да

Используйте fetch Для новых проектов на текущей версии Node, поскольку это не добавляет зависимостей и соответствует API браузера, уже известному разработчикам. Выберите этот вариант. axios Когда автоматическая обработка JSON, перехватчики запросов или отклонение запросов при возникновении ошибок позволили бы сэкономить реальный код. Продолжайте. request только внутри устаревших приложений, которые уже зависят от него и планируют его заменить.

Распространенные ошибки сервера Node.js и способы их исправления

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

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

Часто задаваемые вопросы (FAQ)

Модуль http достаточен для одной конечной точки. Express добавляет маршрутизацию, промежуточное ПО и анализ тела запроса, которые становятся оправданными в качестве зависимости, когда приложение обслуживает несколько маршрутов.

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

Да. AI Инструменты надежно преобразуют колбэки, обрабатывающие ошибки, в асинхронные await. Убедитесь, что сгенерированный код добавляет проверку response.ok, поскольку fetch разрешается при ошибке 404, и эта проверка часто опускается.

Искусственный интеллект-ассистенты считывают код ошибки и напрямую указывают причину, отличая конфликт портов от проблем с правами доступа или синтаксической ошибки, что значительно сокращает количество догадок при работе над первым проектом на Node.js.

Объект запроса представляет собой поток, поэтому соберите его данные в буфер и обработайте результат в конечном событии. Express и аналогичные фреймворки предоставляют промежуточное ПО для анализа тела запроса, которое выполняет этот шаг за вас.

Подведем итог этой публикации следующим образом: