无法使用nodeJS从S3下载文件:less数文件没有完成

这使我疯狂。

我需要我的服务器从S3(最大2 Mb)下载100个相对较小的文件文件。

它总是工作约95%的文件,但它阻止了最后的6-8文件。 resolverejectcallback从来没有被调用…

我试图并行下载文件…

  • 任何人经历过这个
  • 可能是一个数据包丢失,stream不closures?
  • 是否有最大数量的并发下载?

这里是代码,95%的案例在技术上是可行的:

  let singleGetFromS3 = (bucket, fileName) => { return new Promise((resolve, reject) => { let extension = getFileNameExtension(fileName); fs.stat(`./${fileName}`, (err, stat) => { if (err === null) { console.log(`${fileName} exists locally`); resolve(fileName); } else if(err.code === 'ENOENT') { let params = {Bucket: bucket, Key: fileName}; let file = require('fs').createWriteStream(`./tmp-${fileName}`); s3.getObject(params).createReadStream() .on('error', (error) => { return reject(error); }) .on('end', () => { fs.rename(`./tmp-${fileName}`, `./${fileName}`, reject); return resolve(fileName); }) .pipe(file); } else { reject(err); } }); }); }; 

使用:

 "aws-sdk": "^2.23.0", node --version v4.5.0 

看起来你正在倾听什么时候解决错误的事件。 当你从S3的Readable读取所有的字节时,你不想解决,当file完成写操作时,你想要解决这个问题。

 let singleGetFromS3 = (bucket, fileName) => { return new Promise((resolve, reject) => { let extension = getFileNameExtension(fileName); fs.stat(`./${fileName}`, (err, stat) => { if (err === null) { console.log(`${fileName} exists locally`); resolve(fileName); } else if(err.code === 'ENOENT') { let params = {Bucket: bucket, Key: fileName}; let file = require('fs').createWriteStream(`./tmp-${fileName}`); // Listen for the file to be done writing, then resolve file.on('finish', () => { fs.rename(`./tmp-${fileName}`, `./${fileName}`, reject); return resolve(fileName); }) s3.getObject(params).createReadStream() .on('error', (error) => { return reject(error); }) .pipe(file); } else { reject(err); } }); }); };