如何使用nodejs下载大量文件?

时间:2019-04-11 10:16:06

标签: javascript node.js download request

我总共有25000个图片链接。我正在尝试使用nodejs request软件包将这些图像下载到本地。 直到1400015000都在下载,之后我遇到了以下错误。

错误

{ Error: socket hang up
    at TLSSocket.onHangUp (_tls_wrap.js:1148:19)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:111:20)
    at TLSSocket.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickCallback (internal/process/next_tick.js:181:9)
  code: 'ECONNRESET',
  path: null,
  host: 'factory.jcrew.com',
  port: 443,
  localAddress: undefined }
internal/streams/legacy.js:59
      throw er; // Unhandled stream error in pipe.
      ^

Error: EMFILE: too many open files, open 'C:\sangram\fiverr\New folder\public\JCREWFCT\99105154564.png'

下载代码

var request = require('request');

var download = async function (uri, filename, callback) {
  await request.head(uri, function (err, res, body) {
    request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
    if(err) {
      console.log(filename);
      console.log(err);
    }
  });
};

await download(d.image_link_1, saveDir, function () {
});

有人可以指导我一次下载这些可能的文件吗?

1 个答案:

答案 0 :(得分:0)

我看到的主要问题是存在一个EMFILE错误,应通过排队openreaddir调用来适当处理。为此使用graceful-fs

您可能会遇到如此大量的异步请求的另一个问题与池化和允许maxSockets有关。如果发生这种情况,请将池设置为false或适当地设置maxSockets参数。或者,您可以设置http.globalAgent.maxSockets,而不是根据请求设置maxSockets,例如:

var https = require('https');
https.globalAgent.maxSockets = 30000;

签出:https://github.com/request/request