2012-05-15 8 views
7

fordert Ich habe die eingerichtet Folgendes:Sehr einfache Node.js Client wirft Fehler ENOBUFS nach vielen http

Ein node.js Client stellt End-to-End-Anforderungen an einen node.js Server. Nach weniger als einer Minute schlägt der Client mit dem Fehler ENOBUFS fehl.

Client:

(function(){ 

     var loadUrl=function(){ 
      var http=require('http'); 
      var querystring=require('querystring'); 
      var options = {host:"localhost",port:1337,path:'/post',method:'POST'}; 

      var req = http.request(options, function(res){    
       res.setEncoding('utf8'); 
       var body=''; 
       res.on('data', function (chunk) { 
        body+=chunk; 
       });   
       res.on('end', function (chunk) { 
        loadUrl(); 
       }); 
      }); 
      req.on('error', function(e) { 
       console.log('problem with request: ' + e.message); 
      }); 
      var post_data = querystring.stringify({id:0}); 
      req.write(post_data); 
      req.end(); 
     } 
     setTimeout(loadUrl,1000); 
    })() 

Server:

var http = require('http'); 
http.createServer(function (req, res) { 
     res.writeHead(200, {'Content-Type': 'text/plain'}); 
     res.end('Hello World\n'); 
}).listen(1337, '127.0.0.1'); 

Während this question ähnlich ist, ich dies als eine Verallgemeinerung der ursprünglichen Frage ist Entsendung (I Post verwenden, anstatt zu erhalten), mit einem Testfall.

Antwort

4

Das Problem scheint ein Problem mit dem Node.js-HTTP-Clientverbindungspool zu sein.

Wenn Sie die Option agent:false zum options Argument von http.request() function hinzufügen, wird das Verbindungspooling deaktiviert und jede Anforderung verwendet den Header Connection: close. Diese Änderung scheint zu ermöglichen, dass der Clientcode unbegrenzt ausgeführt wird.

var options = {agent:false, host:"localhost", port:1337, /*...*/ }; 

Dadurch wird die Leistung der HTTP-Clients beeinträchtigen und sollten Sie häufige Pausen in den Client-Prozess sehen (vermutlich während der V8 Laufzeit Garbage Collection der Fall ist). Aber es scheint dein Problem zu lösen!

Per @ joshps Kommentar, um zu sehen, ob dieses Problem in einer späteren Version von Node.js behoben wurde oder einen Fehlerbericht einreichen möchte.

+0

Schöne Antwort. Für @Tom lohnt es sich daher, sich die Probleme von Node anzusehen, um zu sehen, ob sie in einer späteren Version bekannt sind oder angesprochen werden. – joshp

+0

@maerics - Danke! Auf welchem ​​Betriebssystem hast du das reproduziert? Hat jemand anderes das Problem reproduziert? Auf welchem ​​Betriebssystem? Frage mich, ob dies Windows-spezifisch ist. – Tom

+0

@Tom: Ich reproduziert unter Mac OS X 10.7 mit Knoten v0.6.10. – maerics