web-dev-qa-db-fra.com

Délai de réponse Express.js

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.

54
Xerri

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.

Note latérale:

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.

65
srquinn

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'));
27
V31

Vous n'avez pas besoin d'autres modules npm pour le faire

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

request.setTimeout(< time in milliseconds >) fait le travail

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

1
rahul shukla