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

28
我试图将文件上传到我的S3存储桶中,然后退出上传函数。问题是,在上传返回存储数据之前,我就从函数中退出了。
我尝试使用async/awaits3.upload,但我认为s3.upload不是一个承诺(promise),所以它什么也没做。
例子:
   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实用程序模块与async.eachasync.eachSeries,参考这个 stack 答案,如下所示:

  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")

但我仍然太早点击了“离开”。我可能有什么误解,但不确定是什么。

更新:

s3.upload返回一个managedUpload对象-那似乎就是为什么await会提前触发。当managedUpload被解析/完成时,回调会被触发。

那么有没有一种方法可以await完成的对象而不是managedUpload

1个回答

70

您应该尝试在 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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接