S3 下载到 Promise 中的 FileStream?

S3 Download to FileStream in Promise?

我正在尝试这样做:

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 () 在成功创建流时并没有真正被调用。事件的 'open' 也没有。

如何在 Promise 中实现这种逻辑?

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

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

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

或利用async/await.

假设您只在流中需要它,请尝试这样的操作:

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);
      });
  });
}

我建议阅读这篇 thread