Обратный вызов AWS S3 putObject не срабатывает - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть лямбда-функция, пытающаяся поместить mp3-файл в корзину S3, однако я не вижу загруженный файл и, что более странно, не вижу никаких записей / ответов от обратного вызова.

Моя лямбда /Все корзины s3 находятся в одной учетной записи AWS, и имя корзины определенно правильное.

Есть что-то, чего я здесь упускаю?Или любое объяснение, почему мой обратный вызов не срабатывает?

exports.handler = async (event, context, callback) => {

    // prior setup

    console.log('about to putObject on s3');

    const s3BucketData = {
        Bucket: 'media-files',
        Key: fileName,
        Body: fileDataBuffer,
        ContentType: 'audio/mp3'
    };

    await s3.putObject(s3BucketData, (err, data) => {
        console.log('putObject callback executing');
        if (err) {
            console.log('err occurred storing to s3: ', err)
        } else{
            console.log(`${fileName} succuessfully uploaded`);
        }
        context.done();
    });
};

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Приведенный ниже пример поможет вам преобразовать putObject в обещание

exports.handler = (event, context, callback) => {

    console.log('about to putObject on s3');

    const s3BucketData = {
        Bucket: 'media-files',
        Key: fileName,
        Body: fileDataBuffer,
        ContentType: 'audio/mp3'
    };

   S3.putObject(s3BucketData).promise()
      .then(data => {
        console.log('complete:PUT Object',data);
         callback(null, data);
      })
      .catch(err => {
        console.log('failure:PUT Object', err);
         callback(err);
      });
};
0 голосов
/ 15 сентября 2018

Прежде всего, это плохая практика - вставлять ваши методы в функцию-обработчик Во-вторых, у вас есть проблемы со временем выполнения. Я имею в виду, что вы выбрали узел 8.10 с поддержкой await / async, но вы все еще пытаетесь использовать обратные вызовы. У меня есть несколько комментариев для вас. Я надеюсь, что это поможет вам.

1) Вы можете просто сделать это:

export async function handler(event)
{
    // body of your function
};

2) Обещаны услуги AWS. Вы должны переписать свой метод s3. Посмотрите на следующий фрагмент. И у меня есть вопрос. Вы уверены, что вам нужно использовать метод putObject вместо загрузки?

try
{
 let s3= new AWS.S3({ region: process.env.AWS_REGION, apiVersion: '2006-03-01' });
 let params = 
{
   Bucket: //aws s3 bucket location (a full path),
   Key: //file name/key,
   Body: //entity to upload,
   ACL: 'public-read' // access policy,
   ContentType: 'audio/mp3' 
};

 let s3Response = await s3.upload(params).promise();
// request successed
 console.log(`File uploaded to S3 at ${s3Response.Bucket} bucket. File 
 location: ${s3Response.Location}`);

 return s3Response.Location; 
}
// request failed
catch (ex)
{
 console.error(ex);
}

Если вы хотите использовать обратные вызовы, то:

s3.upload(params, (err, data) => 
{
  console.log('putObject callback executing');
  if (err) 
  {
     console.error('err occurred storing to s3: ', err);

     return ;
  } 
  console.log(`${fileName} succuessfully uploaded`);

  return data;
});

Надеюсь, вы найдете это полезным. Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...