【问题标题】:async / await looping through array of to get s3 signed URL'sasync / await 循环遍历数组以获取 s3 签名的 URL
【发布时间】:2021-02-11 06:40:50
【问题描述】:

我编写了以下代码。输入(结果)是 S3 存储桶上存在的文件名数组。我希望做的是遍历该列表并为每个列表检索一个签名的 URL。

let result = [{ fileName: "dog.jpg" },{ fileName: "cat.jpg"}];

async function getSignedUrl(key){
    let params = { Bucket: bucketName, Key: key };
    let url = await s3.getSignedUrl('getObject', params, (err, url) => {
      if (err) reject(err)
      return url;
    });
}

async function process(items) {
  for (let item of items) {
    const signedUrl = await getSignedUrl(item.fileName);
    item.url = signedUrl;
  }
  return items;
}


process(result).then(res => {
  console.log(res);
});

问题是当我 console.log 结果时,新的 URL 不存在。我无法弄清楚问题是什么。我猜这是一个异步问题,但我没有足够的经验来解决它。

【问题讨论】:

  • 您只能将await 用于返回承诺的函数,而不是接受回调的函数。

标签: javascript node.js asynchronous async-await


【解决方案1】:
let result = [{ fileName: "dog.jpg" },{ fileName: "cat.jpg"}];

async function getSignedUrl(key){
    return new Promise((resolve,reject) => {
      let params = { Bucket: bucketName, Key: key };
      s3.getSignedUrl('getObject', params, (err, url) => {
        if (err) reject(err);
        resolve(url);
      });
});
}

async function process(items) {
  for (let item of items) {
    const signedUrl = await getSignedUrl(item.fileName);
    item.url = signedUrl;
  }
  return items;
}


process(result).then(res => {
  console.log(res);
});

注意:如果您正在处理一系列可能的承诺,最好使用Promise.all(),因为await 会在异步函数中停止执行该代码(不是事件循环),即使它是一个非阻塞函数。在这种情况下执行并行请求要快得多

【讨论】:

  • 感谢您的回答。这对我帮助很大。我只需要删除 let url = await s3.getSignedUrl 中的“等待”即可使其正常工作。稍后我会尝试用 Promise.all() 来实现它。
  • 哦是的..我忘了删除等待..感谢您指出。
  • 文档好像说getSignedUrl的getObject版本是同步的docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/…为什么要等待同步代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
相关资源
最近更新 更多