web-dev-qa-db-fra.com

Écrivez sur S3 Seau avec Async / Await à AWS Lambda

J'utilise le code ci-dessous (que j'ai ajouté maintenant attendre à) envoyer des fichiers à S3. Cela a fonctionné bien avec mon code Lambda, mais lorsque je déplace pour transférer des fichiers plus volumineux tels que MP4, je pense avoir besoin async/attendre.

Comment puis-je convertir complètement cela en async/attendre?

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');
});
9
Gracie

Comme @djheru a dit, async/attendre ne fonctionne que avec des fonctions qui renvoient des promesses. Je recommanderais de créer une fonction d'emballage simple pour aider à ce problème.

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

Ensuite, vous pourriez l'utiliser comme ça:

const result = await putObjectWrapper(params);

Voici une très grande ressource sur les promesses et async/attendre:

https://javascript.info/async

1
Richard