首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用S3下载nodeJS文件:很少有文件无法完成

无法使用S3下载nodeJS文件:很少有文件无法完成
EN

Stack Overflow用户
提问于 2017-03-07 18:23:05
回答 1查看 338关注 0票数 1

快把我逼疯了。

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

它总是工作~95%的文件,但它阻止了最后6-8个文件。resolvereject回调都不会被调用.

我试着并行下载文件..。

  • 有人经历过吗?
  • 会不会是一个包丢失了而流没有关闭呢?
  • 是否有最大数量的并发下载?

下面是代码,它在95%的情况下都能在技术上起作用:

代码语言:javascript
复制
  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);
        }
      });
    });
  };

使用:

代码语言:javascript
复制
"aws-sdk": "^2.23.0",
node --version
v4.5.0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-07 18:47:38

看起来您正在侦听错误的事件,以确定何时解决。当从S3的Readable中读取所有字节时,您不想解析,而是希望在file完成写入时解析。

代码语言:javascript
复制
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);
        }
      });
    });
  };
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42655550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档