Как скачать большое количество файлов с помощью nodejs? - PullRequest
0 голосов
/ 11 апреля 2019

У меня всего 25000 ссылок на изображения.Я пытаюсь загрузить эти изображения на свой локальный компьютер с помощью пакета nodejs request.до 14000 до 15000 загружается после этого я получаю ниже ошибки.

ошибка

{ 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 голосов
/ 11 апреля 2019

Основная проблема, которую я вижу, состоит в том, что существует ошибка EMFILE, которая должна быть надлежащим образом обработана путем постановки в очередь вызовов open и readdir.Для этого используйте graceful-fs.

Другая проблема, с которой вы можете столкнуться при таком большом количестве асинхронных запросов, связана с пулированием и разрешением maxSockets.Если это произойдет, установите для пула значение false или установите соответствующий параметр maxSockets.Или вместо установки maxSockets по запросу вы можете установить http.globalAgent.maxSockets, например:

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

Checkout: https://github.com/request/request

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...