Выбор ответа Junior HTTP-сервер, Express, NestJS спрашивают часто обновлено

ERR_HTTP_HEADERS_SENT

Вопрос

Почему этот обработчик иногда падает с ERR_HTTP_HEADERS_SENT?

app.get('/users/:id', async (req, res) => {
  const user = await db.findUser(req.params.id);
  if (!user) {
    res.status(404).json({ error: 'not found' });
  }
  res.json(user);
});

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Нет return после 404, и код отвечает второй раз. Когда пользователя нет, обработчик отправляет 404 и продолжает выполнение: res.json(user) пытается отправить заголовки повторно.

Варианты ответа

  1. db.findUser бросает исключение, и Express отвечает дважды
  2. Статус 404 нельзя отправлять через json, только send
  3. Нужно вызвать next() после res.json, иначе ответ висит
  4. Нет return после 404, и код отвечает второй разправильный ответ

Разбор

Когда пользователя нет, обработчик отправляет 404 и продолжает выполнение: res.json(user) пытается отправить заголовки повторно. Исправление: return res.status(404).json(...).

  • Исключение из базы дало бы другую ошибку.
  • next() после отправленного ответа как раз может привести к повторному ответу.
  • json работает с любым статусом.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.