javascript - foreach 中的套接字挂断多个 get 调用
问题描述
我试图从各种 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'
我不知道出了什么问题。图片网址似乎不是无效的。获取请求的返回速度是否不够快?我的内存不足了吗?任何帮助,将不胜感激。
旁注:我也尝试使用节点 https.get(url) 并遇到同样的问题。
解决方案
当您使用 node-fetch 来调用图像时,应该记住一件事是它是基于 promise 的,这意味着它本质上是异步的。如果您进行 N 次 fetch 调用,节点会请求 I/O 操作,从而为您的操作阻塞线程。如果分配给节点进程的线程数超过了,你总是会得到这个错误。
此外,使用 forEach 循环请求 900 张图像是一个坏主意。它一定会阻塞你的节点队列。您可以将您的请求分成一组,比如说 X (X > 5) 个 900 的图像,并进行 900/X 串行调用和 X 并行调用(仍然不推荐它)。
推荐阅读
- java - 如何在java中将后退导航图标添加到appBarLayout
- c# - 使用 WasapiOut Naudio 更改声卡的采样率
- jquery - 在自定义 Angular 6+ 库中使用 jQuery
- python - 是否有一个 pandas/numpy 函数可以将一个整数分布在后续的零上?
- php - SyntaxHighlighter Evolved:PHP 版本 >7.0 无法正常工作
- r - 叠加正态分布图
- jenkins - 从 Jenkins Subversion 插件中获取已删除的 SVN 存储库
- wordpress - 在多站点 wordpress nginx 服务器中更改永久链接后,帖子链接转到 404
- reactjs - 使用 TypeScript 在 React 中键入动态标签?
- python - 无法在 Google Colaboratory 上升级 pyzmq