Як обробити запит у createServer()?
Коли ти викликаєш:
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
javascriptres.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); res.end('<h1>Hello</h1>'); -
JSON
javascriptres.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ ok: true })); -
Файл (стрімом)
javascriptimport { 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. Що відбувається під час обробки
- Клієнт робить HTTP-запит (наприклад, браузер відкриває сторінку).
- Node приймає запит і викликає твій колбек
(req, res). - Ти аналізуєш шлях, метод, заголовки, тіло.
- Формуєш відповідь - встановлюєш код, заголовки й відправляєш дані.
- Node автоматично закриває з'єднання (або тримає його відкритим, якщо keep-alive).
7. Основна ідея
У
createServer()ти отримуєш низькорівневий доступ до HTTP-запиту й відповіді. Це "чиста" точка входу - далі ти сам вирішуєш, як маршрутизувати, що повертати і як обробляти дані.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.