Не получается два раза рендерить страницу с помощью render()
app.post("/start", urlencodedParser, (req, res) => {
console.log(`${req.dateTime} Launch Parser`);
res.render("panel", {info: "Waiting...", preview: ``});
setTimeout(() => {
console.log(`${req.dateTime} Data Received`);
res.render("panel", {info: "Data Received", preview: ``});
}, 2000)
})
Первый рендер работает без ошибок, на втором возникает ошибка.
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
В консоль выводится Data Received. Таймер работает, без него тоже пробовал просто в тупую два рендера. В чем может быть проблема? Объясните пожалуйста простым языком.
Ответы (1 шт):
Ошибка говорит о том, что у вас express пытается ответить с заголовком (в стиле "Статус 200" - все ок). Проблема в том, что у вас уже был ответ, и еще раз ответить он не может. Дословно: не могу установить заголовки, после того, как они отправлены.
Решение, всегда использовать ключевое слово return, когда вы "отвечаете". В вашем примере это либо res.json, либо next. Суть в этом. Пример из api:
https://i.stack.imgur.com/r1dTw.jpg
Если убрать return, то в случае ошибки, мы попадем в if (err) ..., ответим как ошибка(400), и не выйдем из роутинг функции, пойдем ниже и ответим как успешно(200) - и бам-с, получим ошибку - не могу установить заголовки.