Javascript 将多个文件从aws下载到Node js服务器
我需要从AWSS3下载大量文件(比如100k,每个文件大小0.2-1MB)到NodeJS服务器。我使用的代码是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
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个并行后它就停止了,并且它也不会打印全部完成和部分结果。你能帮助我吗