Express 中间件 "connect-timeout" 导致 "Can't set headers after they are sent."
Express middleware "connect-timeout" causes "Can't set headers after they are sent."
我的代码:
timeout = require('connect-timeout')
app.get('/', timeout('5s'), function(req, res){
##DO SOMETHING 1
##DO SOMETHING 2
##DO SOMETHING 3
res.send('ok'); ##line 7
});
当用户请求时。 Node.js 进程 "DO SOMETHING1-3"。但在它处理之前。超时中间件响应,因为它已经设置了 5 秒。之后在第 7 行路由中再次尝试响应。及其导致错误 "Can't set headers after they are sent."
如何处理问题?
我觉得这会是一个常见问题,所以我搜索了 GitHub repository and found this issue。
在这个回答中,我将概述我在上面链接的问题中提出的两种可能的解决方案:
您可以在调用 res.send
:
之前通过 req.timedout
属性 检查请求是否超时
app.get('/', timeout('5s'), function(req, res){
##DO SOMETHING 1
##DO SOMETHING 2
##DO SOMETHING 3
if (!req.timedout) {
res.send('ok'); ##line 7
}
});
或者你可以安装一些顶级中间件来有效地抑制错误:
app.use(function(req,res,next){
var _send = res.send;
var sent = false;
res.send = function(data){
if(sent) return;
_send.bind(res)(data);
sent = true;
};
next();
});
我的代码:
timeout = require('connect-timeout')
app.get('/', timeout('5s'), function(req, res){
##DO SOMETHING 1
##DO SOMETHING 2
##DO SOMETHING 3
res.send('ok'); ##line 7
});
当用户请求时。 Node.js 进程 "DO SOMETHING1-3"。但在它处理之前。超时中间件响应,因为它已经设置了 5 秒。之后在第 7 行路由中再次尝试响应。及其导致错误 "Can't set headers after they are sent."
如何处理问题?
我觉得这会是一个常见问题,所以我搜索了 GitHub repository and found this issue。
在这个回答中,我将概述我在上面链接的问题中提出的两种可能的解决方案:
您可以在调用
之前通过res.send
:req.timedout
属性 检查请求是否超时app.get('/', timeout('5s'), function(req, res){ ##DO SOMETHING 1 ##DO SOMETHING 2 ##DO SOMETHING 3 if (!req.timedout) { res.send('ok'); ##line 7 } });
或者你可以安装一些顶级中间件来有效地抑制错误:
app.use(function(req,res,next){ var _send = res.send; var sent = false; res.send = function(data){ if(sent) return; _send.bind(res)(data); sent = true; }; next(); });