Skip to main content

Як обробити запит у 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

    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-запиту й відповіді. Це "чиста" точка входу - далі ти сам вирішуєш, як маршрутизувати, що повертати і як обробляти дані.

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

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

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