экспресс-тайм-аут для определенного app.get

У меня есть приложение nodejs, которое использует экспресс.

Для конкретного GET-запроса я хотел бы установить тайм-аут, и если этот тайм-аут достигнут, я хотел бы полностью завершить запрос и перенаправить на страницу тайм-аута.

Я попробовал следующее в своем файле route.js:

 app.get('/exec', isLoggedIn, function(req, res) {

   var customTimeout  = 10000;

   req.connection.setTimeout(customTimeout, function(){
    console.log("TIMED!");
    res.render('timeout.ejs', {
        user: req.user,
    });
   });

   //execution of the GET request
   res.render('success.ejs', {
        user: req.user,
   });

 });

Через 10 секунд я вижу сообщение "TIMED!" сообщение в логах, но меня не перенаправляют на страницу тайм-аута, и запрос все еще выполняется в фоновом режиме...

Может ли кто-нибудь помочь мне справиться с этим?


person TehesFR    schedule 28.06.2015    source источник
comment
Изменить, чтобы ответить ниже   -  person Skarlinski    schedule 28.06.2015
comment
Для конкретного запроса GET, как вы проверяете это условие?   -  person laggingreflex    schedule 28.06.2015
comment
Я имею в виду, что у меня есть несколько инструкций app.get в моем файле route.js, я хочу увеличить время ожидания только для одного, app.get('/exec')   -  person TehesFR    schedule 28.06.2015


Ответы (1)


Это работает для меня:

app.get('/exec', isLoggedIn, function(req, res) {
  var customTimeout = 10000;

  res.setTimeout(customTimeout, function(){
    console.log("TIMED!");
    res.render('timeout.ejs', { user: req.user });
  });

  res.render('success.ejs', { user: req.user });
});

Я предполагаю, что вместо последнего res.render() вы выполняете какую-то операцию, которая может занять много времени (и через 10 секунд вы хотите уведомить пользователя о том, что время ожидания операции истекло).

Если эту операцию каким-то образом нельзя отменить, в конце концов она завершится и также попытается отправить ответ, и в этом случае вы можете столкнуться с ошибками (скорее всего, "Невозможно установить заголовки после они отправлены").

Поэтому перед отправкой ответа вам нужно проверить, не был ли он уже отправлен обработчиком тайм-аута. Для этого вы можете использовать res.headersSent.

person robertklep    schedule 28.06.2015
comment
Это была именно моя проблема, и res.headersSent был именно тем, что мне было нужно. Большое спасибо ! - person TehesFR; 29.06.2015