当前位置: 首页 > 面试题库 >

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

公羊凌
2023-03-14
问题内容

我有以下设置:

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

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


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 我需要一个2D数组(作为Json)从服务器发送到客户端。尺寸大约为400x400,每个条目大约包含4个字符的文本。因此,这大约需要640KB的数据。 以下哪种极端方法更好? 我一次性提出了所有数据的大型HTTP请求。 我提出了400个请求-每个请求都要求一行(大约1.6 KB) 我认为最佳方法应该在中间。谁能告诉我这个数据的最佳单个请求大小是多少? 谢谢。 问题答案: 除非您处理的是慢

  • 问题内容: 我有一个node.js应用程序,我想使用它来检查特定站点是否启动并返回正确的响应代码。我希望能够捕获由于域名无法解析或请求超时而出现的任何错误。问题是这些错误导致Node无法处理。我是整个异步编程方法的新手,所以我不确定将try / catch语句放在哪里。 我有一个ajax调用,该调用类似于/ check / site1。服务器端调用一个函数,该函数尝试建立连接,然后返回status

  • 当我运行我的gRPC客户端,它试图将请求流式传输到服务器时,我收到了这个错误:"TypeError: has typelist_iterator,但期望其中之一:bytes, unicode" 我需要以某种方式对我发送的文本进行编码吗?错误消息有一定的意义,因为我肯定是在传入一个迭代器。我从gRPC留档中假设这是需要的。(https://grpc.io/docs/tutorials/basic/p

  • 当浏览器请求网页时,它会向 Web 服务器发送特定信息,这些信息不能被直接读取,因为这些信息是作为 HTTP 请求的头的一部分进行传输的。您可以查看 HTTP 协议 了解更多相关信息。 以下是来自于浏览器端的重要头信息,您可以在 Web 编程中频繁使用: 头信息 描述 Accept 这个头信息指定浏览器或其他客户端可以处理的 MIME 类型。值 image/png 或 image/jpeg 是最常

  • 在我的代码中,我试图反复构建一个客户端,并向远程endpoint发送一个输入流: 输入流包含消息的xml正文。我注意到在第一次迭代中。。。请求成功第二次迭代响应为400错误请求。。。第三个400错误请求。。。。等等。。。 如果我将输入流更改为字符串...获取真实的xml并用PUT方法发送它。 有什么区别?为什么它可以处理字符串而不能处理输入流?(似乎inputstream在第一次迭代后会发生变化)

  • 问题内容: 我正在尝试使用以下行重新索引: 但是我在kibana控制台中遇到以下错误: 谁能告诉我这个问题是什么以及如何摆脱它。 问题答案: 504只是意味着请求仍在运行,但是从Kibana到ES的HTTP连接超时。 您仍然可以使用任务管理API来查看请求的执行情况,如下所示: