Node.js AWS S3 putObject回调未触发
我有一个lambda函数试图将一个mp3文件放入一个S3存储桶中,但是我没有看到上传的文件,更奇怪的是,没有看到来自回调的任何日志记录/响应 我的lambda/s3 bucket都在同一个AWS帐户上,bucket名称绝对正确 这里有我遗漏的东西吗?或者解释一下为什么我的回叫没有被解雇Node.js AWS S3 putObject回调未触发,node.js,amazon-web-services,amazon-s3,aws-lambda,Node.js,Amazon Web Services,Amazon S3,Aws Lambda,我有一个lambda函数试图将一个mp3文件放入一个S3存储桶中,但是我没有看到上传的文件,更奇怪的是,没有看到来自回调的任何日志记录/响应 我的lambda/s3 bucket都在同一个AWS帐户上,bucket名称绝对正确 这里有我遗漏的东西吗?或者解释一下为什么我的回叫没有被解雇 exports.handler = async (event, context, callback) => { // prior setup console.log('about to
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();
});
};
首先,将方法粘贴到处理函数中是一种不好的做法。其次,您的运行时存在一些问题。我的意思是,您选择了支持wait/async的node 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;
});
我希望这对你有帮助。干杯 下面的示例帮助您将
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);
});
};
您的代码是异步/等待、上下文和回调的奇怪组合。有关如何编写此代码的示例,请参见。特别是,s3.putObject()不返回承诺。要从AWS SDK调用中获得承诺,需要使用.Promise()方法。