Express.js Response Timeout

node.jsExpressTimeoutResponseSettimeout

node.js Problem Overview


PROBLEM

I've been looking for request/response timeouts for Express.js but everything seems to be related to the connection rather than the request/response itself.

If a request is taking a long time, it should be timed out. Obviously this shouldn't happen but even a simple mistake as having a route handler without a call to the callback or without res.send(), the browser will keep waiting for a reply forever.

An empty route handler is a perfect example of this.

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

FIX

I added the following before app.use(app,router); and it seemed to add the timeout functionality. Does anyone have any experience/opinion on this?

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

Note that I've set the timeout to 2 minutes.

node.js Solutions


Solution 1 - node.js

There is already a Connect Middleware for Timeout support:

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();
}

If you plan on using the Timeout middleware as a top-level middleware like above, the haltOnTimedOut middleware needs to be the last middleware defined in the stack and is used for catching the timeout event. Thanks @Aichholzer for the update.

Side Note:

Keep in mind that if you roll your own timeout middleware, 4xx status codes are for client errors and 5xx are for server errors. 408s are reserved for when: >The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time.

Solution 2 - node.js

You don't need other npm modules to do this

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

inspired by https://github.com/expressjs/express/issues/3330

or

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

Solution 3 - node.js

An update if one is using Express 4.2 then the timeout middleware has been removed so need to manually add it with

npm install connect-timeout

and in the code it has to be (Edited as per comment, how to include it in the code)

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

Solution 4 - node.js

In case you would like to use timeout middleware and exclude a specific route:

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
});

Solution 5 - node.js

request.setTimeout(< time in milliseconds >) does the job

https://nodejs.org/api/http.html#http_request_settimeout_timeout_callback

Solution 6 - node.js

You can try:

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

In above code, 3000 = 3 sec. Change it according to your requirement.

I have not tried for very long scenarios though. Let me know the results in comments.

Solution 7 - node.js

Before you set your routes, add the code:

app.all('*', function(req, res, next) {
    setTimeout(function() {
        next();
    }, 120000); // 120 seconds
});

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionXerriView Question on Stackoverflow
Solution 1 - node.jssrquinnView Answer on Stackoverflow
Solution 2 - node.jsbereket gebredingleView Answer on Stackoverflow
Solution 3 - node.jsV31View Answer on Stackoverflow
Solution 4 - node.jsciderView Answer on Stackoverflow
Solution 5 - node.jsrahul shuklaView Answer on Stackoverflow
Solution 6 - node.jscyperpunkView Answer on Stackoverflow
Solution 7 - node.jsdestinoView Answer on Stackoverflow