PROBLÈME
Je recherchais des délais d'attente de demande/réponse pour Express.js, mais tout semble être lié à la connexion plutôt qu'à la demande/réponse elle-même.
Si une demande prend beaucoup de temps, il convient de l'exclure. Évidemment, cela ne devrait pas arriver, mais même une simple erreur, comme avoir un gestionnaire d'itinéraire sans appel au rappel ou sans res.send()
, le navigateur continuera à attendre une réponse.
Un gestionnaire d'itinéraire vide en est un parfait exemple.
app.get('/sessions/', function(req, res, callback){});
CORRIGE
J'ai ajouté le suivant avantapp.use(app,router);
et il a semblé ajouter la fonctionnalité de délai d'attente. Quelqu'un at-il une expérience/opinion à ce sujet?
app.use(function(req, res, next){
res.setTimeout(120000, function(){
console.log('Request has timed out.');
res.send(408);
});
next();
});
Notez que j'ai réglé le délai d'attente à 2 minutes.
Il existe déjà un support Connect Middleware 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();
}
Si vous prévoyez d'utiliser le middleware Timeout en tant que middleware de niveau supérieur comme ci-dessus, le middleware haltOnTimedOut
doit être le dernier middleware défini dans la pile et est utilisé pour intercepter l'événement de délai d'expiration. Merci @Aichholzer pour la mise à jour.
N'oubliez pas que si vous lancez votre propre middleware de dépassement de délai, les codes d'état 4xx correspondent aux erreurs des clients et les codes 5xx aux erreurs de serveur. 408s sont réservés pour quand:
Le client n'a pas généré de requête dans le délai d'attente du serveur. Le client PEUT répéter la demande sans modification à un moment ultérieur.
Une mise à jour si on utilise Express 4.2, le middleware de délai d’expiration a été supprimé. Il est donc nécessaire de l’ajouter manuellement avec
npm install connect-timeout
et dans le code, il doit être (édité selon le commentaire, comment l'inclure dans le code)
var timeout = require('connect-timeout');
app.use(timeout('100s'));
var server = app.listen();
server.setTimeout(500000);
inspiré par https://github.com/expressjs/express/issues/33
ou
app.use(function(req, res, next){
res.setTimeout(500000, function(){
// call back function is called when request timed out.
});
next();
});
request.setTimeout(< time in milliseconds >)
fait le travail
https://nodejs.org/api/http.html#http_request_settimeout_timeout_callback