dea*_*au5 3 amazon-s3 amazon-web-services node.js 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();
});
};
Run Code Online (Sandbox Code Playgroud)
小智 5
首先,将您的方法放在处理程序函数中是一种不好的做法。其次,您的运行时存在一些问题。我的意思是您选择了具有 await/async 支持的节点 8.10,但您仍在尝试使用回调。我有一些意见要给你。我希望它会帮助你。
1)你可以简单地做到这一点:
export async function handler(event)
{
// body of your function
};
Run Code Online (Sandbox Code Playgroud)
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);
}
Run Code Online (Sandbox Code Playgroud)
如果你想坚持回调,那么:
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;
});
Run Code Online (Sandbox Code Playgroud)
我希望你会发现这有帮助。干杯!