首页 > 解决方案 > 无法返回 url 字符串,尽管能够对其进行 console.log。不知道为什么

问题描述

我正在编写一个 lambda 函数,我使用 s3.upload 在 s3 中存储一个文件,然后我试图获取一个预签名的 URL s3.getSignedUrl,以便外部用户可以下载我上传的文件。

现在,当我放置一个 console.log 来记录 url 时,该 url 正在 cloudwatch 中登录,但是当我尝试在下一行返回相同的内容时,它不起作用。

 s3.getSignedUrl('getObject', {
                    Bucket: '<Bucket-Name>',
                    Key: '<Key>',
                    Expires: signedUrlExpireSeconds
                }, function(err, url){
                    if(err) throw err;
                    console.log(url);
                    return { ...response, body: JSON.stringify({message: url}) };            
                })
            });
        });

        return { ...response, body: JSON.stringify({message: 'outsideresult'}) };

这是代码的一部分,console.log 行可以记录url,但url没有返回。

并执行外部 return 语句。

该网址按预期工作。请检查,是否有人可以帮助我解决这个问题。

标签: javascriptamazon-s3aws-lambda

解决方案


那是因为这段代码是异步执行的。function(err, url)操作成功时调用作为回调传递的函数。如果您在回调函数中返回某些内容,则不会返回原始范围

s3.getSignedUrl方法不返回您从回调内部传递的值

如果你用 console.logs 执行下面的代码,你会看到 main 函数首先返回,然后回调返回,而它应该是相反的这就是 javascript 的工作原理

 s3.getSignedUrl('getObject', {
                    Bucket: '<Bucket-Name>',
                    Key: '<Key>',
                    Expires: signedUrlExpireSeconds
                }, function(err, url){
                    if(err) throw err;
                    console.log(url);
                    //This is executed later. Returning something here has no effect
                    console.log("Callback returns")
                    return { ...response, body: JSON.stringify({message: url}) };            
                })
            });
        });
console.log("Main Function returns")
        return { ...response, body: JSON.stringify({message: 'outsideresult'}) };

推荐阅读