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

col*_*ars 17 asynchronous amazon-s3 node.js async-await aws-sdk

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

我试图使用async/awaitwith s3.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")
Run Code Online (Sandbox Code Playgroud)

我尝试使用 Async 实用程序模块,async.each在此堆栈答案中async.eachSeries引用如下所示:

  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")
Run Code Online (Sandbox Code Playgroud)

但它仍然过早地“离开”。我误解了一些东西,但我不确定是什么。

更新:

s3.upload返回一个managedUpload对象 - 这似乎是 await 提前触发的原因。当managedUpload解决/完成时触发回调。

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

ant*_*nku 38

你应该尝试调用的承诺()ManagedUpload,以得到一个承诺,并等待其分辨率:

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")
Run Code Online (Sandbox Code Playgroud)