Не получается два раза рендерить страницу с помощью 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 шт):

Автор решения: web developer

Ошибка говорит о том, что у вас express пытается ответить с заголовком (в стиле "Статус 200" - все ок). Проблема в том, что у вас уже был ответ, и еще раз ответить он не может. Дословно: не могу установить заголовки, после того, как они отправлены.

Решение, всегда использовать ключевое слово return, когда вы "отвечаете". В вашем примере это либо res.json, либо next. Суть в этом. Пример из api:

https://i.stack.imgur.com/r1dTw.jpg

Если убрать return, то в случае ошибки, мы попадем в if (err) ..., ответим как ошибка(400), и не выйдем из роутинг функции, пойдем ниже и ответим как успешно(200) - и бам-с, получим ошибку - не могу установить заголовки.

→ Ссылка