以下のコード(今は待ちに追加しました)を使用してS3にファイルを送信しています。ラムダコードで問題なく動作しましたが、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');
});
@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に関する本当に素晴らしいリソースがあります: