如何让 Lambda 函数等待异步操作完成?
How to make Lambda function to wait till async operation finished?
我是 NodeJS 和 AWS Lambda 的新手。我正在创建一个 lambda 函数来为 s3 put 对象获得预签名 URL。我在这里面临的问题是,调用 s3.getSignedUrl
是异步进程,它在回调中响应签名 URL 但在此调用响应之前,lambda 函数控件在此调用之后到达下一行并且空响应是在客户端接收。这是我的 lambda 函数代码片段。
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
.
回调中准备的响应吗
到目前为止最简单的方法是使用 aws-sdk 的 Promise API,然后等待 getSignedUrl
.
如果您只是想创建预签名 url,您可以使用 getSignedUrlPromise
方法 returns promise
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,
});
});
});
};
我是 NodeJS 和 AWS Lambda 的新手。我正在创建一个 lambda 函数来为 s3 put 对象获得预签名 URL。我在这里面临的问题是,调用 s3.getSignedUrl
是异步进程,它在回调中响应签名 URL 但在此调用响应之前,lambda 函数控件在此调用之后到达下一行并且空响应是在客户端接收。这是我的 lambda 函数代码片段。
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
.
到目前为止最简单的方法是使用 aws-sdk 的 Promise API,然后等待 getSignedUrl
.
如果您只是想创建预签名 url,您可以使用 getSignedUrlPromise
方法 returns promise
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,
});
});
});
};