Express.js响应超时

时间:2014-02-11 17:01:52

标签: node.js express timeout response settimeout

问题

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

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

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

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

FIX

我在 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分钟。

7 个答案:

答案 0 :(得分:64)

已经有一个Connect Timeware for Timeout支持:

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:保留时间:

  

客户端在服务器准备等待的时间内没有产生请求。客户端可以在以后重复请求而不做任何修改。

答案 1 :(得分:27)

如果使用Express 4.2进行更新,则超时中间件已被删除,因此需要手动添加

npm install connect-timeout

并且必须在代码中(根据评论编辑,如何将其包含在代码中)

 var timeout = require('connect-timeout');
 app.use(timeout('100s'));

答案 2 :(得分:9)

您不需要其他npm模块即可执行此操作

var server = app.listen();
server.setTimeout(500000);

https://github.com/expressjs/express/issues/3330启发

app.use(function(req, res, next){
res.setTimeout(500000, function(){
        // call back function is called when request timed out.
    });
    next();
});

答案 3 :(得分:2)

如果您想使用超时中间件并排除特定路由:

var timeout = require('connect-timeout');
app.use(timeout('5s')); //set 5s timeout for all requests

app.use('/my_route', function(req, res, next) {
    req.clearTimeout(); // clear request timeout
    req.setTimeout(20000); //set a 20s timeout for this request
    next();
}).get('/my_route', function(req, res) {
    //do something that takes a long time
});

答案 4 :(得分:1)

答案 5 :(得分:-1)

你可以试试:

return await new Promise((resolve) =>
  setTimeout(() => {
    resolve(resp);
  }, 3000),
);

在上面的代码中,3000 = 3 秒。 根据您的要求进行更改。

不过,我还没有尝试过很长时间的场景。在评论中告诉我结果。

答案 6 :(得分:-13)

在设置路线之前,请添加以下代码:

@ResponseBody
@RequestMapping (value = "apiRequest", method = RequestMethod.POST)
public String contestApiSignUp(
        @RequestParam ("username") String username,
        @RequestParam ("firstname") String firstname,
        @RequestParam ("lastname") String lastname,
        @RequestParam ("password") String password,
        @RequestParam ("phone") String phone) {
    return "Hello World";
}