Як працює парсинг тіла в Express.js?
Парсинг тіла в Express.js
Коли клієнт надсилає дані (JSON, форма, файл), вони приходять як потік байтів у тілі запиту. Вбудовані парсери тіла Express читають і парсять ці дані, роблячи їх доступними на req.body.
Вбудовані парсери (Express 4.16+)
const express = require('express');
const app = express();
// Парсинг JSON тіл: { "name": "Alice" }
app.use(express.json());
// Парсинг URL-кодованих форм: name=Alice&age=30
app.use(express.urlencoded({ extended: true }));Не потрібно додаткових пакетів — ці функції вбудовані в Express 4.16+.
express.json()
Парсить запити з Content-Type: application/json.
app.use(express.json({ limit: '10mb' })); // збільшити ліміт розміру
app.post('/users', (req, res) => {
console.log(req.body); // { name: 'Alice', email: 'alice@example.com' }
res.status(201).json(req.body);
});Клієнт повинен надіслати: заголовок Content-Type: application/json.
express.urlencoded()
Парсить HTML форми (Content-Type: application/x-www-form-urlencoded).
app.use(express.urlencoded({ extended: true }));
// extended: true → використовує бібліотеку 'qs' (вкладені об'єкти)
// extended: false → використовує 'querystring' (тільки плоскі)
app.post('/login', (req, res) => {
const { username, password } = req.body;
// ...
});Сирі та текстові парсери
// Парсинг сирого бінарного тіла
app.use(express.raw({ type: 'application/octet-stream' }));
// Парсинг простого текстового тіла
app.use(express.text({ type: 'text/plain' }));Завантаження файлів з Multer
Для multipart/form-data (завантаження файлів) використовуйте пакет multer:
npm install multerconst multer = require('multer');
const storage = multer.diskStorage({
destination: 'uploads/',
filename: (req, file, cb) => {
cb(null, Date.now() + '-' + file.originalname);
}
});
const upload = multer({ storage, limits: { fileSize: 5 * 1024 * 1024 } }); // 5MB
app.post('/upload', upload.single('avatar'), (req, res) => {
console.log(req.file); // інформація про завантажений файл
console.log(req.body); // інші поля форми
res.json({ filename: req.file.filename });
});
// Кілька файлів
app.post('/photos', upload.array('photos', 5), (req, res) => {
console.log(req.files); // масив файлів
});Парсинг, специфічний для маршрутів
Застосовуйте парсери лише до певних маршрутів:
// Парсити JSON лише для API маршрутів
app.use('/api', express.json());
// Різні ліміти для кожного маршруту
app.post('/webhook',
express.raw({ type: 'application/json' }), // сирий для перевірки вебхука Stripe
handleWebhook
);Загальні помилки
// ❌ Забули додати парсер тіла
app.post('/users', (req, res) => {
console.log(req.body); // undefined!
});
// ✅ Додати ПЕРЕД визначеннями маршрутів
app.use(express.json());
app.post('/users', (req, res) => {
console.log(req.body); // { name: 'Alice' }
});Резюме
Використовуйте express.json() для API кінцевих точок і express.urlencoded() для HTML форм. Додавайте ці проміжні програми на початку вашого додатку, перед визначеннями маршрутів. Для завантаження файлів використовуйте пакет multer.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.