有人可以解释ENOBUFS错误吗?

时间:2017-06-21 14:56:34

标签: javascript node.js http https

我正在调用一个包含Windows 7 64位操作系统上大量数据的数据库。当调用排队时,我得到错误(对于第一次错误后的HTTP调用):

Error: connect ENOBUFS *omitted* - Local (undefined:undefined)

从我的谷歌搜索中我了解到这个错误意味着我的缓冲区已经变得太大而我的系统内存无法再处理缓冲区的大小。

但我真的不明白这意味着什么。我正在使用node.js与HTTPS库来处理我的请求。当请求排队并且套接字打开时,缓冲区的大小是否在RAM中分配?什么将允许缓冲区扩展到更大的尺寸?这仅仅是硬件限制吗?

我还读到一些操作系统能够比其他操作系统更好地处理缓冲区的大小。是这样的吗?如果是这样哪个操作系统更适合运行需要通过HTTPS请求获取大量数据的节点脚本?

以下是我的请求。

for (let j = 0; j < dataQueries; j++) {
 getData(function())
}

function getData(callback){
 axios.get(url, config)
   .then((res) => {
      // parse res 
      callback(parsedRes(res))
   }).catch(function(err) {
      console.log("Spooky problem alert! : " + err);
   })
}

为简洁起见,我省略了一些代码,但这通常是我在做我的请求的方式。我有一个for循环,每次迭代都会通过axios启动一个GET请求。

我知道有一个axios.all命令用于存储axios.HTTPMethod给你的承诺,但是当我设置它来存储promises然后通过axios重复承诺时,我看到我的代码没有变化。所有

4 个答案:

答案 0 :(得分:3)

感谢@Jonasw的帮助,但这个问题有一个非常简单的解决方案。 我使用小型库throttled-queue来完成工作。 (如果查看源代码,基于此包实现自己的队列将非常容易。

我的代码更改为:

const throttledQueue = require('throttled-queue')

let throttle = throttledQueue(15, 1000) // 15 times per second

for (let j = 0; j < dataQueries; j++) {\
 throttle(function(){
   getData(function(res){
     // do parsing
   })
 }

}

function getData(callback){
 axios.get(url, config)
   .then((res) => {
      // parse res 
      callback(parsedRes(res))
   }).catch(function(err) {
      console.log("Spooky problem alert! : " + err);
   })
}

答案 1 :(得分:2)

对于我来说,这是通过从工作空间中删除自动生成的zip文件(每次执行 public class ApiKey : IApiKey { public ApiKey(){}//Added default constructor public ApiKey(string key, string owner) { Key = key; OwnerName = owner; } public string Key { get; set; } //Added set property public string OwnerName { get; set; } //Added set property } 都会创建的)来解决的。原来,我的打字稿编译器将这些文件视为源文件,并计入压缩包。

答案 2 :(得分:0)

您同时启动了大量数据查询。您可以使用部分递归函数将它们链接起来,以便它们一个接一个地执行:

(function proceedwith(j) {
   getData(function(){
     if(j<dataQueries-1) proceedwith(j+1); 
   });
})(0)

答案 3 :(得分:0)

启动太多请求时遇到相同的问题。

尝试了throttled-queue,但工作不正常。

system-sleep为我工作,有效地降低了提出请求的速度。最好在同步代码中使用睡眠,以便在使用同步/异步代码之前先进行阻塞。

示例:(使用睡眠限制速率来调用updateAddress())

mvn install