非常简单的Node.js客户端在多次http请求之后抛出错误ENOBUFS

我有以下设置:

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

虽然这个问题是类似的,我发布这个作为原始问题(我使用后,而不是得到)的概括,与testing案例。

这个问题似乎是Node.js HTTP客户端连接池的问题。

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

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

这样做会降低HTTP客户端的性能,并且您应该在客户端进程中看到频繁的暂停(大概在V8运行时进行垃圾回收时)。 但它似乎解决了你的问题!

Per @ joshp的评论,看看这个问题是否已经在更高版本的Node.js中解决,或考虑提交一个错误报告。