我有以下设置:
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),并附有测试用例。
答案 0 :(得分:5)
此问题似乎是Node.js HTTP客户端连接池的问题。
如果将选项agent:false
添加到http.request()
function的options
参数,它将禁用连接池,并使每个请求使用标头Connection: close
。此更改似乎允许客户端代码无限期运行。
var options = {agent:false, host:"localhost", port:1337, /*...*/ };
执行此操作会降低HTTP客户端的性能,您应该会在客户端进程中看到频繁的暂停(可能是在V8运行时执行垃圾回收时)。但它似乎解决了你的问题!
Per @joshp的评论,看看是否已在更高版本的Node.js中解决此问题或考虑提交错误报告。