Встроенные middleware
Тело запроса — данные, которые клиент отправляет вместе с POST, PUT или PATCH: поля формы или JSON. Express сам его не читает, чтобы не тратить время на запросы, которым тело не нужно. Для разбора в Express встроены готовые middleware — устанавливать ничего не надо.
Встроенные middleware
| Функция | Что разбирает | Заголовок Content-Type |
|---|---|---|
express.json() | JSON | application/json |
express.urlencoded() | Данные HTML-формы | application/x-www-form-urlencoded |
express.text() | Простой текст | text/plain |
express.static() | Не разбирает, а раздаёт файлы из папки | — |
Каждая функция смотрит на заголовок Content-Type и разбирает только «свой» формат. Результат попадает в req.body.
JSON
Подключите разбор JSON в начале src/app.js:
// src/app.js
app.use(express.json());
app.post('/api/posts', (req, res) => {
res.status(201).json({ received: req.body });
});Отправьте запрос из терминала:
curl -X POST http://localhost:3000/api/posts -H "Content-Type: application/json" -d '{"title":"Новая статья"}'Сервер вернёт {"received":{"title":"Новая статья"}}: тело разобрано в обычный объект. Если JSON написан с ошибкой, Express сам ответит кодом 400.
Данные форм
Обычная HTML-форма отправляет данные в другом формате — как строку title=...&body=.... Для неё нужна вторая middleware:
// src/app.js
app.use(express.urlencoded());
app.post('/posts', (req, res) => {
res.send(`Заголовок: ${req.body.title}`);
});Теперь форма с полем name="title" и method="post" передаст значение в req.body.title. Подробно формы разобраны в главе о страницах.
Ограничение размера
По умолчанию тело может весить до 100 КБ — запрос побольше получит ответ 413. Лимит меняется опцией limit:
// src/app.js
app.use(express.json({ limit: '1mb' }));Не поднимайте его без нужды: большой лимит позволяет одному клиенту отправить серверу мегабайты мусора.
Где подключать
Обычно обе middleware подключают одной парой в начале src/app.js, до любых маршрутов:
// src/app.js
const app = express();
app.use(express.json());
app.use(express.urlencoded());
app.use('/posts', postsRouter);Частая ошибка
Если клиент не отправил заголовок Content-Type: application/json, express.json() пропустит тело, и req.body останется undefined. В Express 5 это значение по умолчанию, поэтому req.body.title упадёт с ошибкой Cannot read properties of undefined. В curl и fetch() всегда указывайте заголовок, а в обработчике читайте поля осторожно: req.body?.title.