Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Як обробити запит у createServer()?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Колбек `(req, res)`, переданий у `http.createServer()`, і є обробником кожного вхідного запиту: `req` (`IncomingMessage`) містить метод, URL, заголовки та тіло як Readable Stream, а `res` (`ServerResponse`) - Writable Stream, куди ти пишеш статус, заголовки й дані відповіді. **Ключове:** Node не парсить JSON чи маршрути сам - ти сам аналізуєш `req.method`/`req.url`, сам збираєш тіло через події `data`/`end` і сам формуєш відповідь через `res.writeHead()`/`res.end()`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)ЗображенняКоли ти викликаєш: ```javascript import http from 'node:http'; const server = http.createServer((req, res) => { // Обробка запиту тут }); server.listen(3000); ``` функція `(req, res)` - це **обробник кожного вхідного запиту**. Усередині неї ти визначаєш, **що робити з цим запитом і яку відповідь повернути**. ## 1. Що таке `req` і `res` - `req` (`IncomingMessage`) - це об'єкт запиту, тобто все, що прийшло від клієнта: - `req.method` - метод (GET, POST, PUT, DELETE тощо) - `req.url` - шлях і query-параметри - `req.headers` - заголовки - `req` сам є **Readable Stream**, з якого можна читати тіло запиту - `res` (`ServerResponse`) - об'єкт відповіді, який ти відправляєш клієнту: - `res.statusCode` - код відповіді (за замовчуванням 200) - `res.setHeader(name, value)` - встановлення заголовків - `res.write(data)` - записати дані в потік - `res.end([data])` - завершити відповідь (можна передати фінальні дані) ## 2. Приклад: базова обробка GET-запиту ```javascript import http from 'node:http'; const server = http.createServer((req, res) => { if (req.method === 'GET' && req.url === '/') { res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end('Головна сторінка'); } else if (req.method === 'GET' && req.url === '/about') { res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end('Про нас'); } else { res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' }); res.end('Сторінку не знайдено'); } }); server.listen(3000); ``` Тут обробник аналізує `req.method` і `req.url` та повертає різні відповіді. ## 3. Приклад: обробка POST-запиту (читання тіла) Тіло запиту не приходить одразу - воно приходить **порціями (chunk'ами)**, тому `req` працює як потік (`Readable Stream`): ```javascript const server = http.createServer((req, res) => { if (req.method === 'POST' && req.url === '/echo') { let body = ''; req.on('data', chunk => (body += chunk)); req.on('end', () => { const data = JSON.parse(body); res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ youSent: data })); }); } else { res.writeHead(404); res.end(); } }); ``` Node не парсить JSON сам - ти читаєш потік даних, збираєш рядок і парсиш вручну. ## 4. Як додати заголовки й статуси ```javascript res.statusCode = 201; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ message: 'Created' })); ``` або одним рядком: ```javascript res.writeHead(201, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ message: 'Created' })); ``` ## 5. Як повернути HTML, JSON чи файли - **HTML** ```javascript res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.end('<h1>Hello</h1>'); ``` - **JSON** ```javascript res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ ok: true })); ``` - **Файл (стрімом)** ```javascript import { createReadStream } from 'node:fs'; import { pipeline } from 'node:stream'; if (req.url === '/file') { res.writeHead(200, { 'Content-Type': 'text/plain' }); pipeline(createReadStream('file.txt'), res, err => { if (err) console.error(err); }); } ``` ## 6. Що відбувається під час обробки 1. Клієнт робить HTTP-запит (наприклад, браузер відкриває сторінку). 2. Node приймає запит і викликає твій колбек `(req, res)`. 3. Ти аналізуєш шлях, метод, заголовки, тіло. 4. Формуєш відповідь - встановлюєш код, заголовки й відправляєш дані. 5. Node автоматично закриває з'єднання (або тримає його відкритим, якщо keep-alive). ## 7. Основна ідея > У `createServer()` ти отримуєш **низькорівневий доступ** до HTTP-запиту й відповіді. > Це "чиста" точка входу - далі ти сам вирішуєш, > як маршрутизувати, що повертати і як обробляти дані.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.