Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js AWS S3 putObject回调未触发_Node.js_Amazon Web Services_Amazon S3_Aws Lambda - Fatal编程技术网

Node.js AWS S3 putObject回调未触发

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

我有一个lambda函数试图将一个mp3文件放入一个S3存储桶中,但是我没有看到上传的文件,更奇怪的是,没有看到来自回调的任何日志记录/响应

我的lambda/s3 bucket都在同一个AWS帐户上,bucket名称绝对正确

这里有我遗漏的东西吗?或者解释一下为什么我的回叫没有被解雇

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()方法。