123 votes

Comment définir un délai d'attente sur une http.request () dans Node?

J'essaie de définir un délai d'attente sur un client HTTP qui utilise http.request sans succès. Jusqu'ici, ce que j'ai fait est la suivante:

 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 allusions?

102voto

Rob Evans Points 1380

En utilisant votre code, le problème est que vous n'avez pas attendu l'affectation d'un socket à la demande avant de tenter de définir des commandes sur l'objet socket. C'est tout async donc:

 var options = { ... }
var req = http.request(options, function(res) {
  // Usual stuff: on(data), on(end), chunks, etc...
}

req.on('socket', function (socket) {
    socket.setTimeout(myTimeout);  
    socket.on('timeout', function() {
        req.abort();
    });
}

req.write('something');
req.end();
 

L'événement 'socket' est déclenché lorsque la demande est affectée à un objet socket.

44voto

douwe Points 808

À ce moment, il existe une méthode pour le faire directement sur l'objet de requête:

 request.setTimeout(timeout, [callback]);
 

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

20voto

Pierre Maoui Points 346

L’analyseur 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:

 var options = { ... }
var req = http.request(options, function(res) {
  // Usual stuff: on(data), on(end), chunks, etc...
}

req.on('socket', function (socket) {
    socket.setTimeout(myTimeout);  
    socket.on('timeout', function() {
        req.abort();
    });
}

req.on('error, function(err) {
    if (err.code === "ECONNRESET") {
        console.log("Timeout occurs");
        //specific error treatment
    }
    //other error treatment
});

req.write('something');
req.end();
 

-2voto

onteria_ Points 18947

Curieux, que se passe-t-il si vous utilisez plutôt net.sockets place? Voici un exemple de code que j'ai mis en place à des fins de test:

 var net = require('net');

function HttpRequest(host, port, path, method) {
  return {
    headers: [],
    port: 80,
    path: "/",
    method: "GET",
    socket: null,
    _setDefaultHeaders: function() {

      this.headers.push(this.method + " " + this.path + " HTTP/1.1");
      this.headers.push("Host: " + this.host);
    },
    SetHeaders: function(headers) {
      for (var i = 0; i < headers.length; i++) {
        this.headers.push(headers[i]);
      }
    },
    WriteHeaders: function() {
      if(this.socket) {
        this.socket.write(this.headers.join("\r\n"));
        this.socket.write("\r\n\r\n"); // to signal headers are complete
      }
    },
    MakeRequest: function(data) {
      if(data) {
        this.socket.write(data);
      }

      this.socket.end();
    },
    SetupRequest: function() {
      this.host = host;

      if(path) {
        this.path = path;
      }
      if(port) {
        this.port = port;
      }
      if(method) {
        this.method = method;
      }

      this._setDefaultHeaders();

      this.socket = net.createConnection(this.port, this.host);
    }
  }
};

var request = HttpRequest("www.somesite.com");
request.SetupRequest();

request.socket.setTimeout(30000, function(){
  console.error("Connection timed out.");
});

request.socket.on("data", function(data) {
  console.log(data.toString('utf8'));
});

request.WriteHeaders();
request.MakeRequest();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X