Javascript 将多个文件从aws下载到Node js服务器

Javascript 将多个文件从aws下载到Node js服务器,javascript,node.js,amazon-web-services,amazon-s3,download,Javascript,Node.js,Amazon Web Services,Amazon S3,Download,我需要从AWSS3下载大量文件(比如100k,每个文件大小0.2-1MB)到NodeJS服务器。我使用的代码是 app.get('/api/download-all', function(req, res) { res.json({status: 'download initiated'}) downloadFromS3(getDocs()); }); 下载音频的功能是 function downloadFromS3(docs){ docs.forEach((doc, fi

我需要从AWSS3下载大量文件(比如100k,每个文件大小0.2-1MB)到NodeJS服务器。我使用的代码是

app.get('/api/download-all', function(req, res) {
   res.json({status: 'download initiated'})
   downloadFromS3(getDocs());    
});
下载音频的功能是

function downloadFromS3(docs){
docs.forEach((doc, fileIndex)=>{
    var s3FilePath = doc.wav
    var fileName = s3FilePath.split('/').pop();
    var s3Params = {Bucket: 'zzzzz', Key: s3FilePath};
    var file = fs.createWriteStream(dir + '/' + fileName);
    console.log(downloadSession);
    s3.getObject(s3Params)
        .on('httpData', function (chunk) {
            console.log("file writing happening", fileName);
            file.write(chunk);
        })
        .send();
}); }
这里,下载函数触发S3.getObject调用的次数与要下载的文件数相同。它不会等待文件的状态。它几乎像是在让文件下载之前制作了大约100k(在我的例子中)的s3.getObject。这是一种正确的方法,还是应该等待一个文件下载,然后调用s3调用。什么是正确的方法


2) 对于这段代码,我还面临另一个问题。一旦我从UI调用下载api,服务器就会忙于下载。它不会从UI返回任何请求。所有请求都将挂起。是否有任何方式可以在后台进行下载。为了处理这个问题,我已经使用了一些方法,比如子进程或web工作者。我不知道该用哪一个。处理这一问题的最佳方法是什么。

我建议采取介于两者之间的方法。同时启动10万次下载真的不是一个好主意。但同样,等待每次下载完全完成也不会占用您的全部带宽。我建议一种解决方案,即“共享”作业—例如,您创建一个承诺池,每个承诺都可以一次下载一个文件,一旦完成就开始下一个文件

我一直在使用这样的函数:

Promise.pool = function pool(funcs, inParallel, progressCallback) {
  const promises = [];
  const results = [];
  function getNext() {
    if (funcs.length) {
      return funcs.pop()()
      .catch(() => {})
      .then((res) => {
        results.push(res);
        if (progressCallback) {
          progressCallback(results);
        }
        return getNext();
      });
    }
  }
  for (let i = 0; i < Math.min(inParallel, funcs.length); i++) {
    promises.push(getNext());
  }
  return Promise.all(promises)
  .then(() => results);
};
const inParallel = 32;
function callback(partialResults) {
 //console log, whatever
}
Promise.pool(funcs, inParallel, callback)
.then(() => console.log("all done!"));
最后,您可以这样使用它:

Promise.pool = function pool(funcs, inParallel, progressCallback) {
  const promises = [];
  const results = [];
  function getNext() {
    if (funcs.length) {
      return funcs.pop()()
      .catch(() => {})
      .then((res) => {
        results.push(res);
        if (progressCallback) {
          progressCallback(results);
        }
        return getNext();
      });
    }
  }
  for (let i = 0; i < Math.min(inParallel, funcs.length); i++) {
    promises.push(getNext());
  }
  return Promise.all(promises)
  .then(() => results);
};
const inParallel = 32;
function callback(partialResults) {
 //console log, whatever
}
Promise.pool(funcs, inParallel, callback)
.then(() => console.log("all done!"));

下载这么多这样的个人文件有点不寻常。为什么要下载100k文件?不知道是否有机会重新思考您的设计。在并行计数后,它不会继续,我有2个并行,2个并行后它就停止了,并且它也不会打印全部完成和部分结果。你能帮助我吗