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

标签 javascript 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');

this question类似,我将其发布为原始问题的概括(我使用的是 post 而不是 get),并带有一个测试用例。

最佳答案

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

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

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

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

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

关于javascript - 非常简单的 Node.js 客户端在多次 http 请求后抛出错误 ENOBUFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10603860/

相关文章:

javascript - NodeJs 和 ExpressJs 无法设置 Cookie

javascript - 在 Jquery 中搜索每个数据属性

javascript - Vue 多选数据绑定(bind)

javascript - 溢出 div 上的 "Scroll down to update"(或左侧)特征

javascript - 如何检查快速监听回调中的错误?

javascript - 如何从 SNMP 设备迭代对象并使用预定义规则创建可读输出

javascript - 我如何告诉 Mocha 只在浏览器中运行某个测试(而不是在 node.js 中)?

node.js - 带回调和不带回调的 collection.find 有什么区别?

javascript - 无法读取表单中未定义的属性 'props'

javascript - 屏蔽 HTML 密码输入