J'essaie de définir un délai d'attente sur un client HTTP qui utilise http.request sans succès. Jusqu'à présent, j'ai fait ceci:
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();
Des indices?
Réponses:
Juste pour clarifier la réponse ci - dessus :
Il est maintenant possible d'utiliser l'
timeout
option et l'événement de requête correspondant:la source
setTimeout(req.abort.bind(req), 3000);
connect
délai d'expiration, une fois la socket établie, elle n'a aucun effet. Donc, cela n'aidera pas avec un serveur qui maintient le socket ouvert trop longtemps (vous devrez toujours lancer le vôtre avec setTimeout).timeout : A number specifying the socket timeout in milliseconds. This will set the timeout before the socket is connected.
request.destroy
(abort
est obsolète.) Aussi, c'est différent desetTimeout
Mise à jour 2019
Il existe maintenant plusieurs façons de gérer cela plus élégamment. Veuillez voir quelques autres réponses sur ce fil. La technologie évolue rapidement, de sorte que les réponses peuvent souvent devenir obsolètes assez rapidement. Ma réponse fonctionnera toujours, mais cela vaut également la peine de rechercher des alternatives.
Réponse 2012
En utilisant votre code, le problème est que vous n'avez pas attendu qu'un socket soit affecté à la demande avant d'essayer de définir des éléments sur l'objet socket. Tout est asynchrone donc:
L'événement 'socket' est déclenché lorsque la requête reçoit un objet socket.
la source
req.abort()
ne semble pas être une fonctionnalité standard pour le moment. Par conséquent,socket.on
vous voudrez peut-être définir une variable commetimeout = true
, puis gérer le délai d'attente de manière appropriée dans le gestionnaire de réponseEn ce moment, il existe une méthode pour le faire directement sur l'objet de requête:
Il s'agit d'une méthode de raccourci qui se lie à l'événement socket, puis crée le délai d'expiration.
Référence: Manuel et documentation Node.js v0.8.8
la source
La réponse de Rob Evans fonctionne correctement pour moi, mais lorsque j'utilise request.abort (), il se produit une erreur de raccrochage de socket qui reste non gérée.
J'ai dû ajouter un gestionnaire d'erreurs pour l'objet de requête:
la source
myTimeout
fonction? (modifier: la documentation dit: Identique à la liaison à l'événement timeout nodejs.org/api/… )ECONNRESET
cela peut arriver dans les deux cas: le client ferme le socket et le serveur ferme la connexion. Pour déterminer si cela a été fait par le client en appelant,abort()
il y a unabort
événement spécialIl existe une méthode plus simple.
Au lieu d'utiliser setTimeout ou de travailler directement avec socket,
nous pouvons utiliser 'timeout' dans les 'options' des utilisations client
Vous trouverez ci-dessous le code du serveur et du client, en 3 parties.
Partie module et options:
Partie serveur:
Partie client:
Si vous mettez toutes les 3 parties ci-dessus dans un fichier, "a.js", puis exécutez:
alors, la sortie sera:
J'espère que cela pourra aider.
la source
Pour moi, voici une façon moins déroutante de faire
socket.setTimeout
la source
L'élaboration de la réponse @douwe ici est l'endroit où vous mettriez un timeout sur une requête http.
this.abort () est également très bien.
la source
Vous devez passer la référence à la demande comme ci-dessous
L'événement d'erreur de demande sera déclenché
la source
Curieux, que se passe-t-il si vous utilisez
net.sockets
plutôt directement ? Voici un exemple de code que j'ai assemblé à des fins de test:la source