Intento establecer un tiempo de espera en un cliente HTTP que usa http.request sin suerte. Hasta ahora lo que hice es esto:
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();
¿Alguna pista?
Respuestas:
Solo para aclarar la respuesta anterior :
Ahora es posible utilizar la
timeout
opción y el evento de solicitud correspondiente:fuente
setTimeout(req.abort.bind(req), 3000);
connect
tiempo de espera, una vez que se establece el socket, no tiene ningún efecto. Por lo tanto, esto no ayudará con un servidor que mantiene el socket abierto durante demasiado tiempo (aún necesitará lanzar el suyo con setTimeout).timeout : A number specifying the socket timeout in milliseconds. This will set the timeout before the socket is connected.
request.destroy
(abort
está en desuso). Además, esto es diferente desetTimeout
Actualización 2019
Hay varias formas de manejar esto de manera más elegante ahora. Consulte algunas otras respuestas en este hilo. La tecnología se mueve rápido, por lo que las respuestas a menudo pueden quedar desactualizadas con bastante rapidez. Mi respuesta seguirá funcionando, pero también vale la pena buscar alternativas.
2012 respuesta
Usando su código, el problema es que no ha esperado a que se asigne un socket a la solicitud antes de intentar establecer cosas en el objeto socket. Todo es asincrónico, así que:
El evento 'socket' se activa cuando a la solicitud se le asigna un objeto socket.
fuente
req.abort()
no parece ser una funcionalidad estándar en este momento. Por lo tanto,socket.on
es posible que desee establecer una variable comotimeout = true
y luego manejar el tiempo de espera de manera adecuada en el controlador de respuestaEn este momento, existe un método para hacer esto directamente en el objeto de solicitud:
Este es un método de acceso directo que se une al evento de socket y luego crea el tiempo de espera.
Referencia: Node.js v0.8.8 Manual y documentación
fuente
El anwser de Rob Evans funciona correctamente para mí, pero cuando uso request.abort (), se produce un error de colgar el socket que no se controla.
Tuve que agregar un controlador de errores para el objeto de solicitud:
fuente
myTimeout
funcion? (editar: los documentos dicen: Igual que vincularse al evento de tiempo de espera nodejs.org/api/… )ECONNRESET
puede suceder en ambos casos: el cliente cierra el socket y el servidor cierra la conexión. Para determinar si lo hizo el cliente llamando,abort()
hay unabort
evento especialHay un método más sencillo.
En lugar de usar setTimeout o trabajar con socket directamente,
podemos usar 'timeout' en las 'opciones' en los usos del cliente
A continuación se muestra el código tanto del servidor como del cliente, en 3 partes.
Módulo y parte de opciones:
Parte del servidor:
Parte del cliente:
Si pones las 3 partes anteriores en un archivo, "a.js", y luego ejecutas:
entonces, la salida será:
Espero que ayude.
fuente
Para mí, aquí hay una forma menos confusa de hacer el
socket.setTimeout
fuente
Desarrollando la respuesta @douwe aquí es donde pondría un tiempo de espera en una solicitud http.
this.abort () también está bien.
fuente
Debe pasar la referencia para solicitar como a continuación
Se activará el evento de error de solicitud
fuente
Curioso, ¿qué pasa si usa recto en su
net.sockets
lugar? Aquí hay un código de muestra que reuní con fines de prueba:fuente