Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Встроенные middleware

Тело запроса — данные, которые клиент отправляет вместе с POST, PUT или PATCH: поля формы или JSON. Express сам его не читает, чтобы не тратить время на запросы, которым тело не нужно. Для разбора в Express встроены готовые middleware — устанавливать ничего не надо.

Встроенные middleware

ФункцияЧто разбираетЗаголовок Content-Type
express.json()JSONapplication/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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.