Выбор ответа 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) пытается отправить заголовки повторно.
Варианты ответа
db.findUserбросает исключение, и Express отвечает дважды- Статус 404 нельзя отправлять через
json, толькоsend - Нужно вызвать
next()послеres.json, иначе ответ висит - Нет
returnпосле 404, и код отвечает второй разправильный ответ
Разбор
Когда пользователя нет, обработчик отправляет 404 и продолжает выполнение: res.json(user) пытается отправить заголовки повторно. Исправление: return res.status(404).json(...).
- Исключение из базы дало бы другую ошибку.
next()после отправленного ответа как раз может привести к повторному ответу.jsonработает с любым статусом.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «HTTP-сервер, Express, NestJS»
- req.body равен undefined
- Dependency Injection
- Как устроить обработку ошибок в API
- Как Express узнаёт обработчик ошибок
- Express или NestJS: что выбрать
- Ошибки async-обработчиков в Express 5
- Почему Fastify быстрее Express
- Порядок middleware в Express