Не работает функция AWS Lambda для обновления json в корзину s3

#node.js #amazon-web-services #amazon-s3 #aws-lambda

#node.js #amazon-веб-сервисы #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');
};
  

Ответ №1:

NodeJS — интересный язык.

Большинство языков обработали бы ваш код следующим образом

  1. AWS.config.update({..})
  2. var s3 = ..
  3. s3.putObject(.., обратный вызов); (Это требует времени, поэтому придется подождать до завершения)
  4. context.success(..)

Узел js будет обрабатываться в таком порядке.

  1. AWS.config.update({..})
  2. var s3 = ..
  3. s3.putObject(.., обратный вызов); (Это требует времени, поэтому я перейду к следующему шагу)
  4. context.success(..)
  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. обратный вызов (ошибка, ‘processed’) завершит лямбду.

Ответ №2:

Вы можете использовать Q https://www.npmjs.com/package/q или NodeJS обещает обрабатывать задачи в требуемом порядке.