将 json 上传到 s3 存储桶的 AWS Lambda 函数不起作用

AWS Lambda function to updload json to s3 bucket not working

当我运行这个函数的时候,它说成功了,但是文件不在s3 bucket中。

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');
};

NodeJs 是一种有趣的语言。

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

  1. AWS.config.update({..})
  2. var s3 = ..
  3. s3.putObject(.., 回调); (这需要时间,所以它会等到完成)
  4. context.succeed(..)

Node js会按照这个顺序处理。

  1. AWS.config.update({..})
  2. var s3 = ..
  3. s3.putObject(.., 回调); (这需要时间,所以我会进行下一步)
  4. context.succeed(..)
  5. s3.putObject(.., 回调) 已完成。我现在会打电话给回调。
  6. 回调(错误,恢复)。它调用带有错误的回调。因为你的程序有一个空的回调,function(){},它不会对错误做任何事情,你也不会知道它。
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(.., 回调); (这需要时间,但没有其他步骤,所以我会等待)
  4. s3.putObject(.., 回调) 已完成。我现在会打电话给回调。
  5. 回调(错误,恢复)。它调用带有错误的回调。您将打印错误并能够调试您的程序。
  6. callback(err, 'processed') 将结束 lambda。

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