HTTP-сервер без фреймворків
HTTP-сервер у Node.js без фреймворків створюється за допомогою вбудованого модуля http.
Node від початку вже вміє приймати й обробляти HTTP-запити - фреймворки на кшталт Express просто роблять над цим зручну обгортку.
1. Що відбувається "під капотом"
Коли ти викликаєш:
import http from 'node:http';
const server = http.createServer((req, res) => {
res.end('Hello!');
});
server.listen(3000);Node робить наступне:
- Відкриває TCP-порт (3000) і починає слухати з'єднання.
- Кожне з'єднання - це сокет.
- На основі протоколу HTTP Node парсить запит (метод, URL, заголовки, тіло) і передає його в колбек
(req, res). - Ти формуєш відповідь (
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:
if (req.method === 'GET' && req.url === '/users') {
// повернути список користувачів
} else if (req.method === 'POST' && req.url === '/users') {
// створити нового користувача
} else {
// 404
}Так можна вручну описати будь-яку логіку без Express.
4. Як працювати з тілом запиту
Тіло (req) - це Readable Stream.
Node не читає його автоматично, тому ти можеш зібрати дані сам:
let body = '';
req.on('data', chunk => body += chunk);
req.on('end', () => {
const data = JSON.parse(body);
// обробити JSON
});Це дає повний контроль над потоком даних, включно з великими файлами.
5. Як повернути різні типи відповідей
Можна задати заголовки вручну:
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ ok: true }));або текст:
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 тощо) - це просто надбудови, а основа завжди лишається одна й та сама.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.