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