Skip to main content

HTTP-сервер без фреймворків

HTTP-сервер у Node.js без фреймворків створюється за допомогою вбудованого модуля http. Node від початку вже вміє приймати й обробляти HTTP-запити - фреймворки на кшталт Express просто роблять над цим зручну обгортку.

1. Що відбувається "під капотом"

Коли ти викликаєш:

javascript
import http from 'node:http'; const server = http.createServer((req, res) => { res.end('Hello!'); }); server.listen(3000);

Node робить наступне:

  1. Відкриває TCP-порт (3000) і починає слухати з'єднання.
  2. Кожне з'єднання - це сокет.
  3. На основі протоколу HTTP Node парсить запит (метод, URL, заголовки, тіло) і передає його в колбек (req, res).
  4. Ти формуєш відповідь (res.statusCode, res.setHeader, res.end()), і Node відправляє її назад клієнту.

Тобто createServer - це просто "обробник усіх вхідних HTTP-пакетів".

2. Як Node розуміє запити

Об'єкт req (Request):

  • містить метод (req.method - GET, POST тощо),
  • шлях (req.url),
  • заголовки (req.headers),
  • і потік тіла (для POST/PUT).

Об'єкт res (Response):

  • дає можливість вказати статус і заголовки,
  • є Writable Stream, куди ти записуєш дані відповіді.

3. Як зробити найпростіший роутинг

Node не дає "маршрутів" з коробки, але ти можеш використати req.url і req.method:

javascript
if (req.method === 'GET' && req.url === '/users') { // повернути список користувачів } else if (req.method === 'POST' && req.url === '/users') { // створити нового користувача } else { // 404 }

Так можна вручну описати будь-яку логіку без Express.

4. Як працювати з тілом запиту

Тіло (req) - це Readable Stream. Node не читає його автоматично, тому ти можеш зібрати дані сам:

javascript
let body = ''; req.on('data', chunk => body += chunk); req.on('end', () => { const data = JSON.parse(body); // обробити JSON });

Це дає повний контроль над потоком даних, включно з великими файлами.

5. Як повернути різні типи відповідей

Можна задати заголовки вручну:

javascript
res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ ok: true }));

або текст:

javascript
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end('Привіт, світ!');

6. Чому це може бути корисно

Створювати сервер без фреймворків варто, якщо ти:

  • хочеш зрозуміти, як працює Express під капотом;
  • пишеш дуже легкий мікросервіс, де зайва абстракція не потрібна;
  • займаєшся низькорівневим контролем потоків (стрімінг, проксі, HTTP/2, SSE, WebSocket-upgrade);
  • оптимізуєш продуктивність (прибираєш шар middleware).

7. Що можна додати поверх

  • Роутинг: через Map, switch, регулярні вирази чи власний парсер.
  • JSON-парсинг: зібрати тіло й викликати JSON.parse.
  • Статика: читати файли через fs.createReadStream() і відправляти стрімом.
  • CORS: додати заголовки Access-Control-Allow-*.
  • Помилка/404: повернути потрібний статус через res.statusCode.

8. У двох словах

HTTP-сервер у Node.js створюється викликом http.createServer(). Він отримує об'єкти req і res, які представляють HTTP-запит і відповідь. Далі ти сам вирішуєш - як парсити URL, що повернути і які заголовки виставити. Усе інше (роутинг, middleware, body-parser тощо) - це просто надбудови, а основа завжди лишається одна й та сама.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.