Kodokon kodokon.com

Твой первый нативный HTTP-сервер

Ты создаёшь веб-сервер с помощью модуля http из Node, отвечаешь на запросы и возвращаешь JSON.

10 мин · 3 вопросов

Открыть этот урок в Kodokon

Веб-сервер - это программа, которая работает непрерывно и ждёт запросов: обращений, отправленных клиентом (браузером, мобильным приложением и так далее). На каждый запрос она возвращает ответ. Этот диалог идёт по протоколу HTTP - общему языку веба. В Node есть готовый к работе модуль http: ничего устанавливать не нужно. Последнее понятие: порт - число, которое обозначает конкретную программу на машине, как номер квартиры в доме. Мы будем использовать порт 3000; а localhost просто обозначает твою собственную машину.

JAVASCRIPT
import http from "node:http";

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.end("Hello from my server!");
});

server.listen(3000, () => {
  console.log("Server at http://localhost:3000");
});
Сохрани этот код в server.js, затем выполни node server.js.

Разберём по частям. http.createServer получает функцию, которая вызывается на каждый запрос, с двумя параметрами: req (входящий запрос) и res (формируемый ответ). res.statusCode = 200 задаёт код статуса - 200 означает «всё хорошо». res.setHeader добавляет заголовок - метаданные об ответе: здесь это его формат, обычный текст. res.end отправляет ответ и закрывает его. Наконец, server.listen(3000) заставляет сервер слушать порт 3000. Открой в браузере http://localhost:3000: появится твой текст. Обрати внимание, что программа не возвращает управление: она ждёт запросов. Останови её через Ctrl+C.

Современные серверы редко возвращают простой текст: они предоставляют API, которые отвечают в формате JSON - том самом текстовом формате, который ты уже знаешь и который понимает любой язык. Две правки: заголовок Content-Type становится application/json, а объект JavaScript превращается в текст через JSON.stringify. Заодно научимся реагировать по-разному в зависимости от req.url - пути, запрошенного клиентом: это основа маршрутизации.

JAVASCRIPT
import http from "node:http";

const server = http.createServer((req, res) => {
  res.setHeader("Content-Type", "application/json");

  if (req.url === "/api/message") {
    const body = { message: "Hello!", ok: true };
    res.statusCode = 200;
    res.end(JSON.stringify(body));
    return;
  }

  res.statusCode = 404;
  res.end(JSON.stringify({ error: "Not found" }));
});

server.listen(3000, () => {
  console.log("http://localhost:3000/api/message");
});
Известный маршрут отвечает 200 с объектом JSON; любой другой путь получает 404.

Код статуса 404 означает «не найдено»: запрошенный путь не соответствует ни одному известному маршруту. Обрати внимание на return после первого ответа: он не даёт коду продолжиться и отправить второй ответ, что вызвало бы ошибку. Чтобы проверить, открой адрес в браузере или используй curl - инструмент командной строки, который отправляет HTTP-запросы и показывает ответ в терминале.

BASH
curl http://localhost:3000/api/message
Во втором терминале, пока сервер работает: появляется ответ в формате JSON.

Проверка знаний

Убедись, что запомнил ключевые моменты этого урока.

  1. Что делает server.listen(3000)?
    • Заставляет сервер слушать запросы на порту 3000
    • Отправляет запрос на порт 3000
    • Ограничивает сервер 3000 одновременными запросами
    • Открывает браузер на localhost:3000
  2. Какой заголовок нужно отправить, чтобы указать, что ответ - это JSON?
    • Accept: application/json
    • Content-Type: application/json
    • Format: json
  3. Зачем пропускать объект через JSON.stringify перед res.end?
    • Чтобы сжать ответ и сэкономить время
    • Чтобы проверить, что в объекте нет ошибок
    • Потому что HTTP-ответ передаёт текст, а не объект JavaScript