Как избежать выполнения функции Multiple Step из-за асинхронного вызова c? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть лямбда, которая запускает функцию шага. Я попытался обновить его с node.js 10 до nod.je 12, и теперь он запускает две функции шага (в течение двух-трех мс). Выглядит, как он срабатывает дважды, потому что здесь отсутствует концептуальный эффект asyn c. Кто-нибудь может мне это объяснить, пожалуйста?

Старый код (работает)

'use strict';
var AWS = require('aws-sdk');
const s3 = new AWS.S3 ();
exports.handler = (event, context, callback) => {
    event.SourceBucket = "bucket-A";
    event.DestBucket = "bucket-B";
    event.uriBase = decodeURIComponent(event.Records[0].s3.object.key);
    event.uriBase = event.uriBase.substr(0,event.uriBase.lastIndexOf("/"));
    event.uriBaseDel = event.uriBase + "/images";
    event.Move = false;

    //Get all img keys
        const params = {
          Bucket: event.SourceBucket,
          Prefix: event.uriBase + "/images"
        };
        s3.listObjectsV2(params, function(err, data){
          if(err){console.log(err)}else{
            var result = data;  
            event.Keys = result.Contents.map(function(element){return(element.Key);});
                  // Start Step Function with Params
            const stepfunctions = new AWS.StepFunctions();
            const paramsb = {
              stateMachineArn: 'my step function arn',
              input: JSON.stringify(event),
            };

            stepfunctions.startExecution(paramsb, function(err, data) {
              if (err) {callback(err, data);} // an error occurred
              else     {callback(null, data);} // successful response
            });            
          }
        });
};

Новый код (выполняет двойную функцию Step)

'use strict';
var AWS = require('aws-sdk');
const s3 = new AWS.S3 ();
exports.handler = async (event) => {
    event.SourceBucket = "bucket-A";
    event.DestBucket = "bucket-B";
    event.uriBase = decodeURIComponent(event.Records[0].s3.object.key);
    event.uriBase = event.uriBase.substr(0,event.uriBase.lastIndexOf("/"));
    event.uriBaseDel = event.uriBase + "/images";
    event.Move = false;
    //Get all img keys
        const params = {
          Bucket: event.SourceBucket,
          Prefix: event.uriBase + "/images"
        };
        var result = await s3.listObjectsV2(params).promise();
        event.Keys = result.Contents.map(function(element){return(element.Key);});

      const stepfunctions = new AWS.StepFunctions();

      const params2 = {
        stateMachineArn: 'my step function arn',
        input: JSON.stringify(event)
      };

      stepfunctions.startExecution(params2, function(err, data) {
        if (err) {return(err, data);} // an error occurred
        else     {return(null, data);} // successful response
      });
};

...