在AWS Lambda中使用Async / Await写入S3存储桶

Gra*_*cie 2 javascript amazon-s3 node.js async-await aws-lambda

我一直在使用下面的代码(现在已经添加到其中)将文件发送到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');
});
Run Code Online (Sandbox Code Playgroud)

djh*_*eru 10

您只能await执行返回承诺的功能。s3.putObject不返回promise(类似于大多数采用回调的函数)。它返回一个Request对象。如果要使用async / await,则需要将.promise()方法链接到s3.putObject调用的末尾并删除回调(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html#promise-财产

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);
}
Run Code Online (Sandbox Code Playgroud)


Ric*_*ard 9

正如 @djheru 所说,Async/Await 仅适用于返回 Promise 的函数。我建议创建一个简单的包装函数来帮助解决这个问题。

const putObjectWrapper = (params) => {
  return new Promise((resolve, reject) => {
    s3.putObject(params, function (err, result) {
      if(err) reject(err);
      if(result) resolve(result);
    });
  })
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

const result = await putObjectWrapper(params);
Run Code Online (Sandbox Code Playgroud)

这是关于 Promises 和 Async/Await 的非常好的资源:

https://javascript.info/async

  • 我想如果(错误)解决(错误)需要做一些小改变;应替换为 if(err)reject(err); (3认同)