如何让 Lambda 函数等待异步操作完成?
Posted
技术标签:
【中文标题】如何让 Lambda 函数等待异步操作完成?【英文标题】:How to make Lambda function to wait till async operation finished? 【发布时间】:2021-04-16 14:07:51 【问题描述】:我是 NodeJS 和 AWS Lambda 的新手。我正在创建一个 lambda 函数来获取 s3 put 对象的预签名 URL。我在这里面临的问题是,调用 s3.getSignedUrl
是异步进程,它在回调中响应签名 URL,但在此调用响应之前,lambda 函数控件在此调用之后到达下一行,并且在客户端收到空响应。这是我的 lambda 函数的代码 sn-p。
exports.handler = async (event) =>
// Some stuff like reading inputs from request, initialising s3 object with AWS_ACCESS_KEY, and AWS_SECRET_KEY
var response="default response";
response = s3.getSignedUrl('putObject',
"Bucket": myBucket,
"Key": fileName,
"ContentType": fileType
, function (err, url)
if (err)
console.log("error")
return
statusCode: 200,
body: JSON.stringify("Error in creating signed url"),
;
else
console.log("generated "+url)
return
statusCode: 200,
body: JSON.stringify(url),
;
);
console.log("at end");
return response;
;
如果在日志语句方面说,那么在语句error
或generated url
at end
之前打印日志语句并返回默认响应。是否有人可以更正此代码以响应在 s3.getSignedUrl
的回调中准备的响应。
【问题讨论】:
【参考方案1】:如果你只是想创建预签名的 url,你可以使用返回 promise 的 getSignedUrlPromise
方法
exports.handler = async (event) =>
return s3.getSignedUrlPromise("putObject",
Bucket: "my bucket",
Key: "my file name",
ContentType: "some file type",
);
;
如果您需要自定义响应
exports.handler = async (event) =>
return new Promise((resolve, reject) =>
s3.getSignedUrl(
"putObject",
Bucket: "my bucket",
Key: "my file name",
ContentType: "some file type",
,
(err, url) =>
if (err) reject(err);
if (url)
resolve(
statusCode: 200,
body: url,
);
);
);
;
【讨论】:
【参考方案2】:目前最简单的方法是将 Promise API 用于 aws-sdk,然后等待 getSignedUrl
。
【讨论】:
以上是关于如何让 Lambda 函数等待异步操作完成?的主要内容,如果未能解决你的问题,请参考以下文章