【问题标题】:How to synchronously upload files to S3 using aws-sdk?如何使用 aws-sdk 将文件同步上传到 S3?
【发布时间】:2019-12-16 15:15:45
【问题描述】:

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

我尝试将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")

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

更新:

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

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

【问题讨论】:

    标签: node.js asynchronous amazon-s3 async-await aws-sdk


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 2017-01-10
      • 1970-01-01
      • 2021-05-11
      • 2014-05-27
      • 1970-01-01
      • 2021-12-21
      • 2016-04-22
      • 2018-07-07
      相关资源
      最近更新 更多