wake-up-neo.com

Express.js Antwortzeitlimit

PROBLEM

Ich habe nach Zeitüberschreitungen für Anfragen/Antworten für Express.js gesucht, aber alles scheint eher mit der Verbindung als mit der Anfrage/Antwort selbst zu tun zu haben.

Wenn eine Anfrage lange dauert, sollte das Zeitlimit überschritten werden. Offensichtlich sollte dies nicht passieren, aber selbst ein einfacher Fehler wie ein Routen-Handler ohne Rückruf oder ohne res.send(), der Browser wird ewig auf eine Antwort warten.

Ein leerer Routenführer ist ein perfektes Beispiel dafür.

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

FIX

Ich habe die folgenden vorapp.use(app,router); hinzugefügt und es schien die Timeout-Funktionalität hinzuzufügen. Hat jemand irgendwelche Erfahrungen/Meinungen dazu?

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

    next();
});

Beachten Sie, dass ich das Timeout auf 2 Minuten eingestellt habe.

54
Xerri

Es gibt bereits eine Connect Middleware für Timeout-Unterstützung:

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

Wenn Sie die Timeout-Middleware wie oben beschrieben als Top-Level-Middleware verwenden möchten, muss die Middleware haltOnTimedOut die letzte im Stapel definierte Middleware sein und wird zum Abfangen des Timeout-Ereignisses verwendet. Danke @Aichholzer für das Update.

Randnotiz:

Beachten Sie, dass 4xx-Statuscodes für Clientfehler und 5xx für Serverfehler gelten, wenn Sie Ihre eigene Timeout-Middleware rollen. 408s sind reserviert für:

Der Client hat innerhalb der Zeit, in der der Server auf das Warten vorbereitet war, keine Anforderung erstellt. Der Kunde kann die Anfrage zu einem späteren Zeitpunkt ohne Änderungen wiederholen.

65
srquinn

Wenn ein Update Express 4.2 verwendet, wurde die Timeout-Middleware entfernt und muss manuell hinzugefügt werden

npm install connect-timeout

und im Code muss es sein (bearbeitet laut Kommentar, wie man es in den Code einbindet)

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

Sie brauchen keine anderen npm-Module, um dies zu tun

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

inspiriert von https://github.com/expressjs/express/issues/33

oder

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 >) erledigt den Job

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

1
rahul shukla