2012-05-15 31 views
7

Tôi đã thiết lập như sau:Máy khách Node.js rất đơn giản ném lỗi ENOBUFS sau nhiều yêu cầu http

Một khách hàng node.js thực hiện các yêu cầu đầu cuối đến máy chủ node.js. Sau ít hơn một phút, máy khách thất bại với lỗi ENOBUFS.

khách hàng:

(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'); 

Trong khi this question là tương tự, tôi gửi bài này như một sự tổng quát của câu hỏi ban đầu (Tôi đang sử dụng bài chứ không phải là có được), với một trường hợp thử nghiệm.

Trả lời

4

Sự cố có vẻ là sự cố với nhóm kết nối máy khách HTTP Node.js.

Nếu bạn thêm tùy chọn agent:false vào đối số options của http.request() function, nó sẽ vô hiệu hóa kết nối tổng hợp và yêu cầu sử dụng tiêu đề Connection: close. Thay đổi này dường như cho phép mã khách hàng chạy vô thời hạn.

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

Làm như vậy sẽ làm giảm hiệu suất của khách hàng HTTP và bạn sẽ thấy tạm dừng thường xuyên trong quá trình khách hàng (có lẽ trong khi thời gian chạy V8 thực hiện thu gom rác). Nhưng nó dường như giải quyết vấn đề của bạn!

Nhận xét của mỗi @ joshp, xem sự cố này đã được giải quyết trong phiên bản Node.js sau hay xem xét gửi báo cáo lỗi.

+0

Câu trả lời hay. Vì vậy, đối với @Tom, có lẽ bạn nên xem xét các vấn đề cho Node để xem liệu nó có được biết hay được giải quyết trong phiên bản sau không. – joshp

+0

@maerics - Cảm ơn bạn! bạn đã tái tạo cái này ở cái gì? Có ai khác tái tạo vấn đề không? Trên hệ điều hành nào? Tự hỏi nếu điều này là Windows cụ thể. – Tom

+0

@Tom: Tôi đã sao chép trên Mac OS X 10.7 bằng nút v0.6.10. – maerics

Các vấn đề liên quan