有人可以解释 ENOBUFS 错误吗?

新手上路,请多包涵

我正在对一个包含 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 给你的承诺,但是当我将它设置为存储承诺然后通过 axios.all 迭代承诺时,我没有看到我的代码有任何变化

原文由 A. Werner 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

感谢@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);
   })
}

原文由 A. Werner 发布,翻译遵循 CC BY-SA 3.0 许可协议

在我的例子中,通过从我的工作区中删除自动生成的 zip 文件解决了这个问题,我每次这样做都会创建 cdk deploy 。事实证明,我的打字稿编译器将这些文件视为源文件并将它们计入压缩包中。

原文由 kingshuk 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏