一尘不染

非常简单的Node.js客户端在许多HTTP请求后引发错误ENOBUFS

node.js

我有以下设置:

node.js客户端向node.js服务器发出端到端请求。不到一分钟后,客户端失败,错误为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');

尽管这个问题很相似,但我将其作为原始问题的概括(我使用的是发布而不是获取),并带有一个测试用例。


阅读 173

收藏
2020-07-07

共1个答案

一尘不染

该问题似乎是Node.js HTTP客户端连接池出现的问题。

如果将选项添加agent:false函数options参数中,它将禁用连接池,并使每个请求都使用标头。此更改似乎允许客户端代码无限期运行。http.request()Connection: close

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

这样做会降低HTTP客户端的性能,您应该在客户端进程中看到频繁的暂停(大概是在V8运行时进行垃圾收集时)。但这确实可以解决您的问题!

根据@joshp的评论,查看此问题是否已在更高版本的Node.js中解决,或考虑提交错误报告。

2020-07-07