10

私は次の設定をしています:

node.js クライアントは、node.js サーバーに対してエンドツーエンドの要求を行います。1 分も経たないうちに、クライアントはエラー ENOBUFS で失敗します。

クライアント:

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

サーバ:

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

この質問は似ていますが、元の質問の一般化としてこれを投稿しています(取得ではなく投稿を使用しています)、テストケースを使用しています。

4

1 に答える 1

6

この問題は、Node.js HTTP クライアント接続プールに問題があるようです。

このオプションagent:false関数optionsの引数に追加すると、接続プールが無効になり、各リクエストでヘッダーが使用されます。この変更により、クライアント コードを無期限に実行できるようです。http.request()Connection: close

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

これを行うと、HTTP クライアントのパフォーマンスが低下し、クライアント プロセスで頻繁に一時停止が発生するはずです (おそらく、V8 ランタイムがガベージ コレクションを実行している間)。しかし、それはあなたの問題を解決するようです!

@joshp のコメントに従って、この問題が Node.js の新しいバージョンで対処されているかどうかを確認するか、バグ レポートを提出することを検討してください。

于 2012-05-15T16:03:31.910 に答える