2010-08-27 1 views
8

Ich schreibe eine node.js-Anwendung, die mit einem Server sprechen muss. Er stellt eine HTTP-Verbindung mit dem folgenden Code:Wie stelle ich ein Timeout für Client http Verbindungen in node.js

var client = http.createClient(u.port, u.hostname, u.secure); 
client.on("error", function(exception) { 
    logger.error("error from client"); 
}); 
var request = client.request(method, u.path, headers); 

Ich sehe keine Möglichkeit, in der node.js Dokumentation für einen Timeout auf der Verbindung einstellen, und es scheint, auf 20 Sekunden voreingestellt werden. Das Problem, das ich habe, ist, dass ich in China Nutzer habe, die ein langsames oder flockiges Netzwerk zu sein scheinen, die manchmal die Timeout-Verbindung zu unserem Rechenzentrum in den USA getroffen haben. Ich möchte das Zeitlimit auf 1 Minute erhöhen, um zu sehen, ob es das für sie behebt.

Gibt es eine Möglichkeit, das in node.js zu tun?

+1

Die richtigen Antworten sind alle in dieser doppelten Frage: http://stackoverflow.com/questions/6214902/how-to-set-a-timeout-on-bttp-request-in-node (besonders siehe douwe's Antwort) – Sandman4

+0

Mögliches Duplikat von [Wie setze ich ein Timeout für eine http.request() in Node?] (https://stackoverflow.com/questions/6214902/how-to-set-a-timeout-on-a- http-request-in-node) –

Antwort

4

Ich denke, man kann etwas tun wie:

request.connection.setTimeout(60000) 

request.connection gibt die net.Stream Objekt mit der Verbindung zugeordnet ist. und net.Stream hat eine setTimeout-Methode.

+0

Funktioniert nicht. Ich fand auch eine client.setTimeout() -Methode, die auch nicht funktioniert. Ich denke, das sind Timeouts für den Verkehr auf der Verbindung, nicht für den Verbindungsaufbau. –

+0

Rechts. Ok dann ... Ich werde einen weiteren Code durchforschen. Es könnte sich lohnen, zu prüfen, ob und wie einige der Node-Frameworks das handhaben. –

+0

Danke, dass ein WebSocket-Proxy-Problem für mich gelöst hat;) Die Verbindungen waren nach einer Minute oder so tot. –

6

Versuchen

request.socket.setTimeout (60000); // 60 Sek.

+1

Das ist die richtige Antwort mit Knotenrand mindestens ... https://github.com/ry/node/blob/master/lib/http.js#L774 – Quickredfox

1

Sie müssen zuerst warten, bis die Verbindung zum Client-Socket hergestellt ist, bevor Sie das Zeitlimit setzen. Um dies zu tun, einen Rückruf für die 'Steckdose' Ereignis hinzufügen:

req.on('socket', function (socket) { 
    myTimeout = 500; // millis 
    socket.setTimeout(myTimeout); 
    socket.on('timeout', function() { 
     console.log("Timeout, aborting request") 
     req.abort(); 
    }); 
}).on('error', function(e) { 
    console.log("Got error: " + e.message); 
    // error callback will receive a "socket hang up" on timeout 
}); 

See this answer.

1

Es gibt keine Möglichkeit, in Node zu erhöhen Verbindung Timeout. Da üblicherweise ein Verbindungs-Timeout (d. H. Verbindungsherstellungs-Timeout) eine OS-weite Einstellung für alle Anwendungen ist (z. B. 21 Sekunden in Windows, von 20 bis 120 Sekunden). Siehe auch Timouts in Request package.

Im Gegensatz dazu erlaubt Node das Setzen eines verringerten Timeouts und das Abbrechen der Verbindung, selbst wenn die Verbindung noch nicht hergestellt ist.

Die weiteren Timeouts (falls die Verbindung hergestellt wurde) können gemäß der Dokumentation gesteuert werden (siehe request.setTimeout, socket.setTimeout).

Verwandte Themen