首页 > 解决方案 > AWS S3 putObject 回调未触发

问题描述

我有一个 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();
    });
};

标签: node.jsamazon-web-servicesamazon-s3aws-lambda

解决方案


首先,将方法粘贴在处理程序函数中是一种不好的做法。其次,您的运行时存在一些问题。我的意思是您选择了支持等待/异步的节点 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;
});

我希望你会发现这很有帮助。干杯!


推荐阅读