AWS S3 putObject回调未触发

时间:2018-09-14 14:09:12

标签: node.js amazon-web-services amazon-s3 aws-lambda

我有一个lambda函数试图将mp3文件放入S3存储桶中,但是我没有看到我的文件上传,更奇怪的是,没有从回调中看到任何日志记录/响应。

我的lambda / 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 :(得分:2)

首先,将方法粘贴在处理程序函数中是一种不好的做法。第二,您的运行时存在一些问题。我的意思是,您选择了具有await / async支持的节点8.10,但仍尝试使用回调。 我有话给你希望对您有所帮助。

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;
});

我希望对您有所帮助。干杯!

答案 1 :(得分:2)

下面的示例可帮助您将ClientType*转换为承诺

putObject
相关问题