Узел JS запрашивает огромное количество картинок - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь запросить огромное количество изображений на узле js (n> 3000) а затем сохранить их в папку. Я пытался использовать библиотеку запросов и запрос-обещание. Проблема заключается в том, что если количество изображений слишком велико, некоторые изображения не завершают загрузку, оставляя неполные данные или получая ошибку (пустой файл .jpeg). Есть ли лучший способ загрузки огромного количества картинок? Также мне нужно, когда картинки все скачать, чтобы запросить функцию компиляции () сделать их в видео. Я использую ffmpeg для этого.

Ниже приведены два способа, которыми я пытался это сделать.

const req = require('request');
const request = require('request-promise');
const fs = require('fs');
const ffmpegPath = require('@ffmpeg-installer/ffmpeg').path;
const ffmpeg = require('fluent-ffmpeg');
ffmpeg.setFfmpegPath(ffmpegPath);

function downloadImgs(imgUrls) {
  let promises = [];
  let prom;
  for (let i = 0; i < imgUrls.length; i++) {
    imgPath = `assets/pics/st_${pad(i + 1, 3)}.jpg`

    prom = request(imgUrls[i]);
    prom.on('error', () => console.log('err'));
    prom.pipe(fs.createWriteStream(imgPath));
    promises.push(prom);
  }

  Promise.all(promises).then(() => {
    console.log('I Run');
    compilee();
  });

  //SECOND TRY-----------------------------------------
  for (let i = 0; i < imgUrls.lengh; i++) {
    imgUrl = imgUrls[i];
    req(imgUrl)
      .on('error', () => console.log("img error", imgUrl))
      .pipe(fs.createWriteStream(`assets/pics/st_${pad(i + 1, 3)}.jpg`)).on('close', () => {
        console.log('downloaded', x)
      })
  }
  compilee();

//---------------------------------------------------------

  function compilee() {
    command
      .on('end', onEnd)
      // .on('progress', onProgress)
      .on('error', onError)
      .input('assets/pics/st_%03d.jpg')
      .inputFPS(5)
      .output('assets/output/pepe.mp4')
      .outputFps(30)
      .run();
  }

Ошибки, которые я получаю для first : UnhandledPromiseRejectionWarning: RequestError: Ошибка: зависание сокета

и второй : Ошибка: сокет зависает at createHangUpError (_http_client.js: 330: 15) в TLSSocket.socketOnEnd (_http_client.js: 433: 23) на TLSSocket.emit (events.js: 187: 15) в endReadableNT (_stream_readable.js: 1098: 12) в process.internalTickCallback (internal / process / next_tick.js: 72: 19) код: 'ECONNRESET'}

Кроме того, я должен загрузить изображения на сервер или на клиент, если я хочу немедленно отправить видео клиенту.

1 Ответ

0 голосов
/ 06 января 2019

Я могу предложить вам использовать асинхронную библиотеку. Que может быть хорошим решением

var q = async.queue(function({url,index}, callback) {
    // Do ur job here
}, 5);

// assign a callback
q.drain = function() {
    console.log('All images downloaded');
};

// add items to the queue
for (let i = 0; i < imgUrls.length; i++) {
    q.push({url : imgUrls[i], index : i});
}

Ofc, это не рабочий блок всего кода, а просто чтобы дать вам идею. Надеюсь, это поможет

...