我一直在使用下面的代码(我现在添加了等待代码)将文件发送到S3。它可以很好地与我的lambda代码配合使用,但是当我转移诸如MP4之类的较大文件时,我觉得我需要异步/等待。
如何将其完全转换为异步/等待状态?
exports.handler = async (event, context, callback) => {
...
// Copy data to a variable to enable write to S3 Bucket
var result = response.audioContent;
console.log('Result contents ', result);
// Set S3 bucket details and put MP3 file into S3 bucket from tmp
var s3 = new AWS.S3();
await var params = {
Bucket: 'bucketname',
Key: filename + ".txt",
ACL: 'public-read',
Body: result
};
await s3.putObject(params, function (err, result) {
if (err) console.log('TXT file not sent to S3 - FAILED'); // an error occurred
else console.log('TXT file sent to S3 - SUCCESS'); // successful response
context.succeed('TXT file has been sent to S3');
});
答案 0 :(得分:5)
您只有await
个函数返回承诺。 s3.putObject
不返回承诺(类似于大多数采用回调的函数)。它返回一个Request
对象。如果要使用异步/等待,则需要将.promise()
方法链接到s3.putObject
调用的末尾并删除回调(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html#promise-property)
try { // You should always catch your errors when using async/await
const s3Response = await s3.putObject(params).promise();
callback(null, s3Response);
} catch (e) {
console.log(e);
callback(e);
}
答案 1 :(得分:0)
正如@djheru所说,Async / Await仅与返回promise的函数一起使用。 我建议创建一个简单的包装函数来解决此问题。
const putObjectWrapper = (params) => {
return new Promise((resolve, reject) => {
s3.putObject(params, function (err, result) {
if(err) resolve(err);
if(result) resolve(result);
});
})
}
然后您可以像这样使用它:
const result = await putObjectWrapper(params);
关于Promises和Async / Await,这是一个非常有用的资源: