如何使用aws-sdk同步上传文件到S3?

How to synchronously upload files to S3 using aws-sdk?

我正在尝试将文件上传到我的 S3 存储桶,然后 return 退出我的上传功能。问题是我 return 在上传 return 存储的数据之前退出了该功能。

我曾尝试将 async/awaits3.upload 一起使用,但我不认为 s3.upload 是一个承诺,因此它不会执行任何操作。

例如:

   for (const file of files) {
    const params = {
      Bucket: BUCKET_NAME,
      Key: file.name,
      Body: file.data
    };
    const stored = await s3.upload(params, (err, data) => {
      if (err) console.log("error", err, err.stack);
      return console.log(data);
    });
    console.log(stored);
   }
   console.log("leave loop")

我已尝试将异步实用程序模块与 async.eachasync.eachSeries 一起使用 in this stack answer,如下所示:

  const saveFile = async file => {
    const params = {
      Bucket: BUCKET_NAME,
      Key: file.name,
      Body: file.data
    };
    s3.upload(params, (err, data) => {
      if (err) console.log("error", err, err.stack);
      console.log(data);
    });
  };

  await async.eachSeries(files, saveFile, err => {
    if (err) console.log(err);
  });

  console.log("leave loop")

但它仍然过早达到 "leave"。我误会了什么,但我不确定是什么。

更新:

s3.upload return 是一个 managedUpload 对象 - 这似乎是 await 提前触发的原因。当managedUpload为resolved/completed时触发回调。

那么有没有办法 await 完成的对象而不是 managedUpload

您应该尝试在 ManagedUpload 上调用 promise() 以获得 Promise 并等待其解决:

for (const file of files) {
  const params = {
    Bucket: BUCKET_NAME,
    Key: file.name,
    Body: file.data
  };
  try {
    const stored = await s3.upload(params).promise()
    console.log(stored);
  } catch (err) {
    console.log(err)
  }
}
console.log("leave loop")