Объект ответа
Объект ответа res — второй аргумент обработчика. Через него сервер сообщает клиенту код состояния, заголовки и тело ответа. Код состояния — число, по которому клиент понимает результат: 200 — успех, 404 — не найдено, 500 — ошибка сервера.
Текст и HTML
res.send() отправляет строку. Если строка похожа на HTML, браузер покажет её как страницу:
// src/app.js
app.get('/about', (req, res) => {
res.send('<h1>О блоге</h1><p>Пишем про Express.</p>');
});На http://localhost:3000/about появится заголовок и абзац. Заголовок Content-Type: text/html Express выставит сам.
JSON
res.json() превращает объект или массив в JSON и выставляет заголовок Content-Type: application/json:
// src/app.js
import { posts } from './data/posts.js';
app.get('/api/posts', (req, res) => {
res.json(posts);
});По адресу /api/posts браузер покажет массив статей в формате JSON. Так отвечают программам, а не людям.
Код состояния
По умолчанию код — 200. res.status() меняет его и возвращает тот же res, поэтому вызовы пишут цепочкой:
// src/app.js
app.get('/api/posts/:id', (req, res) => {
const post = posts.find((item) => item.id === Number(req.params.id));
if (!post) {
return res.status(404).json({ error: 'Статья не найдена' });
}
res.json(post);
});Если тело не нужно, используйте res.sendStatus(204) — он отправит только код.
Перенаправление
res.redirect() отправляет браузер на другой адрес. По умолчанию код — 302, «временно перемещено»:
// src/app.js
app.get('/blog', (req, res) => {
res.redirect('/posts');
});
app.get('/old-posts', (req, res) => {
res.redirect(301, '/posts');
});Откройте /blog — адресная строка сразу сменится на /posts. Код 301 говорит, что адрес изменился навсегда, и поисковики запомнят новый.
Сводка методов
| Метод | Что делает |
|---|---|
res.send(text) | Отправляет текст или HTML |
res.json(data) | Отправляет JSON |
res.status(code) | Задаёт код состояния, ответ не отправляет |
res.sendStatus(code) | Отправляет только код |
res.redirect(url) | Перенаправляет на другой адрес |
res.set(name, value) | Задаёт заголовок |
res.render(view, data) | Отправляет страницу по шаблону |
res.sendFile(path) | Отправляет файл |
Частая ошибка
На один запрос можно отправить только один ответ. Если после res.json() код продолжит выполняться и вызовет ответ ещё раз, Express выдаст ошибку Cannot set headers after they are sent to the client. Ставьте return перед ответом, после которого обработчик должен закончиться, как в примере с кодом 404. И помните, что res.status(404) сам ничего не отправляет: после него обязательно нужен send() или json().