AWS Lambda函数将json更新到s3存储桶不起作用

时间:2016-10-23 05:11:01

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

当我运行此功能时,它表示它成功,但该文件不在s3存储桶中。

var AWS = require('aws-sdk');
exports.handler = (event, context, callback) => {

    AWS.config.update({
        region: 'us-west-2',
        accessKeyId: 'xxx',
        secretAccessKey: 'xxx'
    });

    var s3 = new AWS.S3();

    s3.putObject({
        Bucket: 'mybucket',
        Key: 'test.json',
        Body: [{test: 'test'}, {test: 'test'}],
        ContentType: "application/json"
    }, function(){});

    context.succeed('SUCCESS');
};

2 个答案:

答案 0 :(得分:2)

NodeJs是一种有趣的语言。

大多数语言会像这样处理您的代码

  1. AWS.config.update({..})
  2. var s3 = ..
  3. s3.putObject(..,callback); (这需要时间,所以它会等到它完成)
  4. context.succeed(..)
  5. 节点js将按此顺序处理。

    1. AWS.config.update({..})
    2. var s3 = ..
    3. s3.putObject(..,callback); (这需要时间,所以我将进入下一步)
    4. context.succeed(..)
    5. s3.putObject(..,callback)已经完成。我现在打电话给回电。
    6. 回调(错误,res)。它调用带有错误的回调。由于你的程序有一个空回调函数function(){},它不会对错误做任何事情,你也不会知道它。
    7. var AWS = require('aws-sdk');
      
      exports.handler = (event, context, callback) => {
      
      AWS.config.update({
         region: 'us-west-2',
         accessKeyId: 'xxx',
         secretAccessKey: 'xxx'
      });
      
      var s3 = new AWS.S3();
      s3.putObject(
          {
            Bucket: 'mybucket',
            Key: 'test.json',
            Body: [{test: 'test'}, {test: 'test'}],
            ContentType: "application/json"
          },
      function(err, res){
          if(err){
               console.log(err);
           }
           callback(err, "processed");
      });
      };
      

      ^回调将告诉lambda它是脚本的结尾。 它现在将按此处理。

      1. AWS.config.update({..})
      2. var s3 = ..
      3. s3.putObject(..,callback); (这需要时间,但没有另一步,所以我会等待)
      4. s3.putObject(..,callback)已经完成。我现在打电话给回电。
      5. 回调(错误,res)。它调用带有错误的回调。您将打印错误并能够调试您的程序。
      6. 回调(错误,'处理')将结束lambda。

答案 1 :(得分:0)

您可以使用Q https://www.npmjs.com/package/q或NodeJs承诺按要求的顺序处理任务。