在特定app.get上表达超时

时间:2015-06-28 13:34:45

标签: node.js express

我有一个使用快递的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秒后,我可以看到“定时!”日志中的消息,但我没有重定向到超时页面,请求仍然在后台运行...

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

这对我有用:

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