Encodera

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

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

Оглавление

Объект ответа

Объект ответа 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().

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

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