【问题标题】:AWS S3 getSignedUrl loop not working properly?AWS S3 getSignedUrl 循环无法正常工作?
【发布时间】:2021-08-03 02:48:41
【问题描述】:

我想在我的 Express 路由中为 [user.idKey, user.selfieKey] 数组中的每个键发回两个 S3 预签名 URL。

我知道 S3 已成功获取预签名 URL,因为它们将使用回调 console.log(url) 登录到控制台。

我也尝试在 getSignedUrl 方法前使用“await”,但我认为这不适用于 S3..???

知道我做错了什么吗?

谢谢!


router.get(`/api/verification/load`, auth, async (req, res) => {

  try {
    const user = await User.findOne({ GETS A USER })

    let urlArray = []

    const keyArray = [user.idKey, user.selfieKey]
   
    for (const key in keyArray) {
      s3VerificationBucket.getSignedUrl(
        "getObject",
        {
          Bucket: "app-verification",
          Key: key,
          Expires: 30,
        },
        (err, url) => urlArray.push(url) // when console.log(url) it logs urls 
      )
    }

    if (urlArray.length === 0) {  
      console.log("URL ARRAY EMPTY")  -> RETURNS "URL ARRAY EMPTY"
    }

    const idUrl = urlArray[0]
    const selfieUrl = urlArray[1]

    res.send({ user, idUrl, selfieUrl })
  } catch (err) {
    res.status(500).send()
  }
})


【问题讨论】:

    标签: javascript amazon-web-services express amazon-s3


    【解决方案1】:

    您正在同步发送响应。您正在异步签署您的链接。因此,在您已经响应之后填充数组。

    改为使用s3VerificationBucket.getSignedUrl(...).promise() 来获得每个操作的承诺。

    使用Promise.all(...)等待所有操作的结果再响应。

    只有在您处理完所有异步工作后,您才能res.send(...)

    【讨论】:

    • 谢谢@Chase,但我如何将它应用到我现有的代码中?
    猜你喜欢
    • 2019-01-01
    • 2014-12-02
    • 2013-08-09
    • 2013-10-30
    • 2013-10-19
    • 2017-02-03
    相关资源
    最近更新 更多