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