一尘不染

Express.js响应超时

node.js

问题

我一直在寻找Express.js的请求/响应超时,但是一切似乎都与连接有关,而不是请求/响应本身。

如果请求花费很长时间,则应该超时。显然,这不应该发生,但即使是一个简单的错误,如具有不调用回调或不调用的路由处理程序res.send(),浏览器将永远等待答复。

空路由处理程序就是一个很好的例子。

app.get('/sessions/', function(req, res, callback){});

固定

之前 添加了以下内容 app.use(app,router);并且似乎添加了超时功能。有人对此有任何经验/意见吗?

app.use(function(req, res, next){
    res.setTimeout(120000, function(){
        console.log('Request has timed out.');
            res.send(408);
        });

    next();
});

请注意,我已将超时设置为2分钟。


阅读 371

收藏
2020-07-07

共1个答案

一尘不染

已经有用于超时的Connect中间件支持:

var timeout = express.timeout // express v3 and below
var timeout = require('connect-timeout'); //express v4

app.use(timeout(120000));
app.use(haltOnTimedout);

function haltOnTimedout(req, res, next){
  if (!req.timedout) next();
}

如果计划将Timeout中间件用作上述的顶级中间件,则该haltOnTimedOut中间件必须是堆栈中定义的最后一个中间件,并用于捕获超时事件。感谢@Aichholzer的更新。

边注:

请记住,如果滚动自己的超时中间件,则4xx状态代码用于客户端错误,而5xx状态用于服务器错误。408保留给以下情况:

在服务器准备等待的时间内,客户端未发出请求。客户端可以在以后的任何时间重复请求而无需修改。

2020-07-07