我的代码:
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行路由尝试再次响应。它会导致错误"发送后不能设置标头"。
如何处理这个问题?
我有一种感觉,这将是一个常见的问题,所以我搜索了GitHub存储库,发现了这个问题。
在这个答案中,我将概述我上面链接的问题提出的两种可能的解决方案:
-
您可以在调用
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(); });