首页 > 解决方案 > S3 在 Promise 中下载到 FileStream?

问题描述

我正在尝试这样做:

function getObjectStream(keyFile) {
    return new Promise(function(success, reject) {
        let stream = s3.getObject({ Bucket: aws_exports.imageBucket, Key: keyFile })
            .createReadStream()
            .on('end', function () {
            console.log("sucesfully downloaded");
            success(stream);
        }).on('error', function(err) {
            console.log(err);
            reject(error);
        });
    });
}

这基本上是从 S3 下载一个对象,将其转换为读取流,然后在创建该读取流时返回成功或失败。

问题是.on('end', function ()在成功创建流时并没有真正调用它。活动也没有“开放”。

我如何在 promise 中实现这种逻辑?

标签: javascriptamazon-s3aws-sdk

解决方案


你在这里做错的是.on('end', function ())而不是.on('close', function ()).

但为什么还要这样做呢?aws-sdk提供了一个.promise(),你可以简单地做

s3.getObject(params).promise().then(...).catch(...)

或使用异步/等待。

假设您只需要在流中使用它,请尝试以下操作:

function getObjectAndWriteToFile(keyFile) {
  return new Promise(function(success, reject) {
    const destPath = `/tmp/${path.basename(key)}`
    s3.getObject({ Bucket: aws_exports.imageBucket, Key: keyFile })
      .createReadStream()
      .pipe(fs.createWriteStream(destPath))
      .on('close', function () {
          console.log("sucesfully downloaded");
          resolve(destPath)
      })
      .on('error', function(err) {
        console.log(err);
        reject(error);
      });
  });
}

我建议阅读这个线程


推荐阅读