Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «HTTP-сервер без фреймворків». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Через вбудований модуль `http`: `http.createServer((req, res) => {...})` відкриває TCP-порт, парсить кожен запит у об'єкти `req`/`res` і передає їх у колбек, а маршрутизацію, парсинг тіла й заголовки ти прописуєш вручну. **Ключове:** `req` - це Readable Stream, `res` - Writable Stream; фреймворки на кшталт Express лише зручно обгортають цей самий низькорівневий механізм.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення**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 тощо) - це просто надбудови, а основа завжди лишається одна й та сама.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.