【问题标题】:AWS S3 putObject callback not firingAWS S3 putObject 回调未触发
【发布时间】:2018-12-04 20:14:17
【问题描述】:

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

【问题讨论】:

  • 您的代码是异步/等待、上下文和回调的奇怪组合。请参阅aws.amazon.com/blogs/compute/… 了解如何编写此代码的示例。特别是, s3.putObject() 不返回 Promise。要从 AWS 开发工具包调用中获取 Promise,您需要使用 .promise() 方法。

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


【解决方案1】:

首先,将方法粘贴在处理函数中是一种不好的做法。其次,您的运行时存在一些问题。我的意思是您选择了支持等待/异步的节点 8.10,但您仍在尝试使用回调。 我有一些cmets给你。希望对你有所帮助。

1) 你可以这样做:

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

2) 承诺提供 AWS 服务。您必须重新编写您的 s3 方法。看看下面的sn-p。我有一个问题。确定必须使用 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;
});

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

【讨论】:

    【解决方案2】:

    以下示例帮助您将putObject 转换为promise

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

    【讨论】:

      猜你喜欢
      • 2016-04-15
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 2016-10-08
      • 1970-01-01
      • 2019-07-14
      相关资源
      最近更新 更多