Ich versuche, ein Timeout auf einem HTTP-Client festzulegen, der http.request ohne Glück verwendet. Bisher habe ich Folgendes getan:
var options = { ... }
var req = http.request(options, function(res) {
// Usual stuff: on(data), on(end), chunks, etc...
}
/* This does not work TOO MUCH... sometimes the socket is not ready (undefined) expecially on rapid sequences of requests */
req.socket.setTimeout(myTimeout);
req.socket.on('timeout', function() {
req.abort();
});
req.write('something');
req.end();
Irgendwelche Hinweise?
Antworten:
Nur um die Antwort oben zu verdeutlichen :
Jetzt ist es möglich, die
timeout
Option und das entsprechende Anforderungsereignis zu verwenden:quelle
setTimeout(req.abort.bind(req), 3000);
connect
Zeitlimit ist. Sobald der Socket eingerichtet ist, hat er keine Auswirkung mehr. Dies hilft also nicht bei einem Server, der den Socket zu lange offen hält (Sie müssen immer noch Ihren eigenen mit setTimeout rollen).timeout : A number specifying the socket timeout in milliseconds. This will set the timeout before the socket is connected.
request.destroy
(abort
ist veraltet). Dies unterscheidet sich auch vonsetTimeout
Update 2019
Es gibt verschiedene Möglichkeiten, dies jetzt eleganter zu handhaben. Bitte sehen Sie einige andere Antworten auf diesen Thread. Tech bewegt sich schnell, so dass Antworten oft ziemlich schnell veraltet sind. Meine Antwort wird immer noch funktionieren, aber es lohnt sich auch, nach Alternativen zu suchen.
2012 Antwort
Bei Verwendung Ihres Codes besteht das Problem darin, dass Sie nicht darauf gewartet haben, dass der Anforderung ein Socket zugewiesen wird, bevor Sie versuchen, Inhalte für das Socket-Objekt festzulegen. Es ist alles asynchron, also:
Das 'Socket'-Ereignis wird ausgelöst, wenn der Anforderung ein Socket-Objekt zugewiesen wird.
quelle
req.abort()
scheint im Moment keine Standardfunktionalität zu sein. Dahersocket.on
möchten Sie möglicherweise eine Variable wie festlegentimeout = true
und dann das Zeitlimit im Antworthandler entsprechend behandelnIn diesem Moment gibt es eine Methode, um dies direkt für das Anforderungsobjekt zu tun:
Dies ist eine Verknüpfungsmethode, die an das Socket-Ereignis bindet und dann das Zeitlimit erstellt.
Referenz: Node.js v0.8.8 Handbuch und Dokumentation
quelle
Die Rob Evans-Antwort funktioniert für mich korrekt, aber wenn ich request.abort () verwende, tritt ein Socket-Aufhängefehler auf, der unbehandelt bleibt.
Ich musste einen Fehlerhandler für das Anforderungsobjekt hinzufügen:
quelle
myTimeout
funktion (Bearbeiten: Die Dokumente sagen: Entspricht der Bindung an das Timeout-Ereignis nodejs.org/api/… )ECONNRESET
dies in beiden Fällen passieren kann: Der Client schließt den Socket und der Server schließt die Verbindung. Um festzustellen, ob es vom Kunden durch einen Anruf gemacht wurde,abort()
gibt es ein besonderesabort
EreignisEs gibt eine einfachere Methode.
Anstatt setTimeout zu verwenden oder direkt mit Socket zu arbeiten, können
wir 'Timeout' in den 'Optionen' in Client-Anwendungen verwenden
Unten finden Sie den Code von Server und Client in drei Teilen.
Modul- und Optionsteil:
Serverteil:
Client-Teil:
Wenn Sie alle oben genannten 3 Teile in eine Datei einfügen, "a.js", und dann ausführen:
dann wird die Ausgabe sein:
Hoffentlich hilft das.
quelle
Für mich - hier ist eine weniger verwirrende Art, das zu tun
socket.setTimeout
quelle
Wenn Sie hier auf die Antwort @douwe eingehen, können Sie eine http-Anfrage zeitlich festlegen.
this.abort () ist auch in Ordnung.
quelle
Sie sollten die Referenz wie unten angegeben anfordern
Das Anforderungsfehlerereignis wird ausgelöst
quelle
Neugierig, was passiert, wenn Sie
net.sockets
stattdessen gerade verwenden? Hier ist ein Beispielcode, den ich zu Testzwecken zusammengestellt habe:quelle