2010-08-27 40 views
8

Estoy escribiendo una aplicación node.js que necesita hablar con un servidor. Se establece una conexión HTTP con el siguiente código:¿Cómo puedo establecer un tiempo de espera para las conexiones http de los clientes en 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); 

no veo ninguna opción en la documentación Node.js para establecer un tiempo de espera de la conexión, y parece ser fijado a 20 segundos por defecto. El problema que tengo es que tengo usuarios en China en lo que parece ser una red lenta o escamosa, que a veces golpean el tiempo de espera para conectarse a nuestro centro de datos en los EE. UU. Me gustaría aumentar el tiempo de espera a 1 minuto, para ver si eso lo arregla para ellos.

¿Hay alguna manera de hacerlo en node.js?

+1

Las respuestas correctas están todas en esta pregunta duplicada: http://stackoverflow.com/questions/6214902/how-to-set-a-timeout-on-a-http-request-in-node (especialmente, vea douwe's respuesta) – Sandman4

+0

Posible duplicado de [¿Cómo establecer un tiempo de espera en una http.request() en el nodo?] (https://stackoverflow.com/questions/6214902/how-to-set-a-timeout-on-a- http-request-in-node) –

Respuesta

4

Creo que se puede hacer algo como:

request.connection.setTimeout(60000) 

request.connection devuelve el objeto net.Stream asociado a la conexión. y net.Stream tiene un método setTimeout.

+0

No funciona. También encontré que hay un método client.setTimeout() que tampoco funciona. Creo que estos son tiempos de espera para el tráfico en la conexión, no para establecer la conexión. –

+0

Derecha. Ok, entonces ... tendré otra red de arrastre a través de algún código. Puede valer la pena verificar cómo/si algunos de los marcos de nodos manejan esto. –

+0

Gracias que resolvió un problema de proxy de WebSocket para mí;) Las conexiones habían muerto después de un minuto más o menos. –

6

Trate

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

+1

Esa es la respuesta correcta con borde de nodo al menos ... https://github.com/ry/node/blob/master/lib/http.js#L774 – Quickredfox

1

Tiene que esperar a que se establezca primero la conexión del zócalo del cliente, antes de configurar el tiempo de espera. Para ello, agregue una devolución de llamada para el evento 'toma':

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

No hay capacidad en el nodo aumentar tiempo de espera de conexión. Como normalmente el tiempo de espera de conexión (es decir, el tiempo de espera de establecimiento de la conexión) es una configuración de todo el sistema operativo para todas las aplicaciones (por ejemplo, 21 segundos in Windows, de 20 a 120 segundos in Linux). Vea también Timouts in Request package.

Por el contrario, Node permite establecer un tiempo de espera reducido y cancelar la conexión incluso en el caso de que la conexión aún no esté establecida.

Se pueden controlar los tiempos de espera adicionales (en caso de conexión establecida) de acuerdo con la documentación (consulte request.setTimeout, socket.setTimeout).

Cuestiones relacionadas