перезагрузка страницы из express с помощью setInterval

#javascript #node.js #mongodb #express

#javascript #node.js #mongodb #экспресс

Вопрос:

У меня есть код, который

а) обрабатывает маршрут POST,
б) использует API для генерации токена доступа и рендеринга страницы, и
в) запускает код с интервалом.

Проблема в том, что первый экземпляр работает нормально, но во втором экземпляре я получаю ERR_HTTP_HEADERS_SENT ошибку. Мой код:

 app.post("/intervalQuote",(req,res)=>{
  MongoClient.connect(url,{ useNewUrlParser: true, useUnifiedTopology: true }, (err,db)=>{
    if (err) throw err;
    const dbo = db.db('ameritrade');
    const ticker = req.body.ticker.toUpperCase();
    
    function intervalTimer() {
      access_token(dbo).then((access_token)=>{
        quote(access_token,ticker).then((quote)=>{
          res.render('quote',{result: quote});
        })
      })
    }
    intervalTimer();
    setInterval(intervalTimer,10*1000);
  })
})
  

Мне нужно иметь возможность запускать access_token , а затем quote выполнять функции перед рендерингом quote шаблона. Как я могу сделать это с интервалом и перезагрузить страницу? Большое спасибо за помощь / предложение!

Ответ №1:

Ошибка ERR_HTTP_HEADERS_SENT вызвана отправкой ответа несколько раз res.render('quote',{result: quote}); в setInterval(intervalTimer,10*1000); . Согласно документации ExpressJS, res.render отправляет клиенту отображенную строку HTML.

После того, как вы отправили ответ клиенту, вы не можете отправить другой ответ, как сказано здесь . res.render Функция завершает цикл запроса-ответа.

Подводя итог, не устанавливайте интервал для повторного отображения статического HTML.

Комментарии:

1. Спасибо, Хосе! Я все еще в недоумении относительно того, как действовать дальше. Если вы знаете, какие темы я должен осветить, чтобы получить представление, это было бы оценено

Ответ №2:

Неважно, я понял это. Дух, мой мозг был заморожен. Все, что мне нужно было сделать, это переместить функцию setInterval на сторону клиента. Спасибо всем за то, что посмотрели на вопрос!