2016-08-12 3 views
14

ProblemKnotenserver, socket, Anfrage- und Antwort Timeouts

Knotens Standardkonfiguration Timeouts Anfragen nach 2 Minuten. Ich mag die Anfrage Timeouts ändern:

  • 1 Minute für die ‚normalen‘ fordert
  • 5 Minuten für die Anforderungen, die statischen Dateien (großes Vermögen in diesem Fall)
  • 8 Stunden für Uploads (Paar dienen von tausend Bilder pro Anfrage)

Forschung

durch Node's documentation Lesen, habe ich entdeckt, th Es gibt zahlreiche Möglichkeiten, Timeouts zu definieren.

  1. server.setTimeout
  2. socket.setTimeout
  3. request.setTimeout
  4. response.setTimeout

Ich Express verwendet, die middleware bietet auch Timeout des für (bestimmte) Routen zu definieren. Ich habe das versucht, without success.

Frage

Ich bin verwirrt darüber, wie man richtig das Zeitlimit global und pro Route konfigurieren. Sollte ich alle oben genannten Timeouts konfigurieren? Wie unterscheidet sich das Timeout des Servers von dem Festlegen des Zeitlimits des Sockets oder der Anfrage?

+0

hat dieses Beispiel nicht geholfen https://github.com/expressjs/timeout#connect – AJS

Antwort

3

Als ich auf your other question concerning the usage of the timeout middleware sah man es irgendwie anders verwenden.

Siehe Dokumentation von timeout-connect middleware.

Fügen Sie Ihre errorhandler-Funktion als Eventlistener auf die Anfrage, wie es ein EventEmitter ist und die Middleware verursacht es die timeout -event auszusenden:

req.on("timeout", function (evt) { 
    if (req.timedout) { 
     if (!res.headersSent) { 
     res 
      .status(408) 
      .send({ 
      success: true, 
      message: 'Timeout error' 
     }); 
     } 
    } 
}); 

Dies ist außerhalb des Middlewarestacks aufgerufen, wodurch der Funktionsaufruf next(err) ungültig wird. Bedenken Sie auch, dass Sie, wenn die Zeitüberschreitung auftritt, während die Anforderung serverseitig hängt, verhindern müssen, dass Ihr Server-Code diese Anforderung weiter verarbeitet (da Header bereits gesendet werden und die zugrunde liegende Verbindung nicht mehr verfügbar ist)).

+0

Danke für die Antwort! Wie kann ich verhindern, dass andere Middleware-Funktionen diese Anfrage bearbeiten, wenn "next()" hier ungültig ist? – Voles

+0

Wie Ms. Nazmul Hossain Bilashs Antwort feststellt, können Sie eine andere Middleware-Schicht zwischen Handlern verwenden, die bei der Anfrage nach "req.timedout" suchen. Ein anderer Weg wäre, den Aufruf der "next" -Funktion zu überschreiben (affe-patch) und es einfach zu verhindern, wenn "req.timedout" "true" ist. – dth

+0

Um noch einmal zu verdeutlichen, ist der Aufruf von 'next()' hier ungültig, weil diese Funktion kein Middleware- oder Request-Handler ist! Es handelt sich um einen Event-Handler, der außerhalb Ihrer Anfrageverarbeitung agiert. – dth

3

Zusammenfassung

  • NodeJS Timeout-API sind alle Inaktivitäts-Timeout
  • Express.js/timeout Paket Antwort Fest Timeout

NodeJS Timeout API

Server.Timeout

  • Inaktivitäts/Leerlauf-Timeout
  • gleich
  • Buchse
  • Standard 2min

Server-Timeout.SetTimeout

  • Inaktivitäts/Leerlauf-Timeout
  • gleich Socket-Timeout
  • Standard 2min
  • haben Rückruf

socket.setTimeout

  • inactivit y/Leerlauf-Timeout
  • Rückruf verantwortlich() zu beenden, destroy() Buchse
  • Standard kein Timeout

response.setTimeout

  • socket.setTimeout vorderen Ende

anfrage.setTimeout

  • socket.setTimeout vorderen Ende

Express.js/timeout Paket

  • Reaktion hart timeout (vs Inaktivität)
  • haben Rückruf

Schlussfolgerung

  • max. Zeit für eine Aktion (Anfrage + Antwort), Express/Timeout-Paket ist erforderlich.

    Dies ist richtig, was Sie brauchen, aber der Rückruf muss die Anfrage/Antwort zu beenden. Da das Timeout nur den Rückruf auslöst, ändert es weder den Status noch stört es die Verbindung. Es ist der Callback-Job.

  • Idle Timeout, eingestellt NodeJS api Request/Response-Timeout

    Ich empfehle diese nicht berühren, da es in den meisten Fällen nicht notwendig ist. Es sei denn, Sie möchten eine Verbindung im Leerlauf (kein Verkehr) über 2 Minuten zulassen.

+0

Können Sie Ihre Schlussfolgerung über die max. Zeit für eine Aktion erlaubt? Danke im Voraus! – Voles

+0

@Voles Bei "Max. Zeit erlaubt" wird einer Aktion (Dateiübertragung oder DB-Abfrage) ein bestimmter Zeitschlitz zugewiesen, z. B. 10 Minuten. Nach 10 Minuten wird die Aktion, falls noch nicht abgeschlossen, beendet. –

2

Es gibt bereits eine Connect-Middleware für Timeout-Unterstützung. Sie können diese Middleware ausprobieren.

var timeout = express.timeout // express v3 and below 
var timeout = require('connect-timeout'); //express v4 

app.use(timeout(120000)); // should be changed with your desire time 
app.use(haltOnTimedout); 

function haltOnTimedout(req, res, next){ 
    if (!req.timedout) next(); 
} 
+0

Danke, aber was ist mit "Wie unterscheidet sich das Zeitlimit des Servers von dem Festlegen der Zeitüberschreitung des Sockets oder der Anfrage?"? – Voles

Verwandte Themen