javascript - 套接字在foreach中挂起多个get调用

标签 javascript arrays node.js get fetch

我试图从不同的 URL 获取多个图像,所以我一起使用 forEach 和 fetch(url) 。我还尝试将它们通过管道传输到流以将它们保存到磁盘。问题是在大约 900 个请求之后,请求计数急剧减慢并最终出现错误。这是我使用的代码。

   const fetch = require('node-fetch')
   // savedImageURLS is an array of many image urls
   savedImageURLS.forEach((url) => {
      fetch(url).then((res) => {
        console.log(count)
        const dest = fs.createWriteStream(`images/image-${count++}.png`);
        res.body.pipe(dest)
      }).catch((err) => {
        console.log('something went wrong', err)
      })
   })

我收到此错误:

something went wrong { FetchError: request to https://scontent-yyz1-1.cdninstagram.com/vp/0b261beb7775c9accecc15ef782c2d9e/5E51A24B/t51.2885-15/e35/66648821_222609615365883_2370330998081102527_n.jpg?_nc_ht=scontent-yyz1-1.cdninstagram.com&_nc_cat=103&se=7&ig_cache_key=MjA4NTI1NTY3NTY5Mjk0NDk3NA%3D%3D.2 failed, reason: socket hang up
    at ClientRequest.<anonymous> (/Documents/batcave/instagram-saved-downloader/node_modules/node-fetch/lib/index.js:1455:11)
    at ClientRequest.emit (events.js:160:13)
    at TLSSocket.socketErrorListener (_http_client.js:389:9)
    at TLSSocket.emit (events.js:160:13)
    at emitErrorNT (internal/streams/destroy.js:64:8)
    at process._tickCallback (internal/process/next_tick.js:152:19)
  message: 'request to https://scontent-yyz1-1.cdninstagram.com/vp/0b261beb7775c9accecc15ef782c2d9e/5E51A24B/t51.2885-15/e35/66648821_222609615365883_2370330998081102527_n.jpg?_nc_ht=scontent-yyz1-1.cdninstagram.com&_nc_cat=103&se=7&ig_cache_key=MjA4NTI1NTY3NTY5Mjk0NDk3NA%3D%3D.2 failed, reason: socket hang up'

我不知道出了什么问题。图片网址似乎不是无效的。 get 请求返回的速度不够快吗?我的内存不足了吗?任何帮助,将不胜感激。

旁注:我也尝试使用 Node https.get(url) 进行此操作并遇到了相同的问题。

最佳答案

当您使用 Node 获取来调用图像时,应该记住一件事是它是基于 promise 的,这意味着它本质上是异步的。如果您进行 N 次 fetch 调用, Node 会请求 I/O 操作,从而阻塞您的操作的线程。如果分配给 Node 进程的线程数超过,您总是会收到此错误。

此外,使用 forEach 循环请求 900 个图像也是一个坏主意。它必然会阻塞你的 Node 队列。您可以将您的请求分成 X (X > 5) 个 900 图像的突发,并串行进行 900/X 调用,并行进行 X 调用(仍然不推荐)。

关于javascript - 套接字在foreach中挂起多个get调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58902640/

相关文章:

javascript - jquery中心图像放大后溢出:auto container

javascript - 从两个模型返回数据

javascript - React JS 在使用 Axios 的 XMLHttpRequest 中出错

java - 如何在 Java 中显示数组中的某些数字?

javascript - JavaScript 如何创建稀疏数组?

c - 将二维数组传递给常量参数的函数

css - 在 SASS 中创建一个集合(数组)用于@for 循环

javascript - 带 Node 的简单用户登录验证模块

javascript - 如何关闭 pubnub 连接?

node.js - 请求模块,浏览器取消时如何停止流式传输