Почему моя функция await lambda.invoke вызывает lambda несколько раз? - PullRequest
1 голос
/ 03 февраля 2020

В настоящее время

У меня есть lambdaX , который вызывает другой lambdaY .

Lambda X:

"use strict";

const AWS = require('aws-sdk');
AWS.config.region = 'ap-southeast-2';
var lambda = new AWS.Lambda();

exports.handler = async (event) => {

  //the final return
  var dataToSave = []

  //data to be added to array
  let returnLoad;

  var params = {
    FunctionName: 'lambdaY', // the lambda function we are going to invoke
    InvocationType: 'RequestResponse',
    LogType: 'Tail', //Set to Tail to include the execution log in the response.
  };

  try {
    await lambda.invoke(params, function(err, data) {
      if (err) {
        console.log("Error");
        console.log(err, err.stack);
      } else {
        console.log("Success");
        console.log(data);
        returnLoad = data.Payload;
      }
    }).promise();

    dataToSave.push(returnLoad);

  } catch (err) {
      console.log('some error occurred...');
  }

  const response = {
      statusCode: 200,
      body: JSON.stringify(dataToSave)
  };
  return response;
}

Lambda Y:

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

Проблема

По какой-то причине lambdaY вызывает 2+ раза каждый раз, когда я вызываю lambdaX . Обратите внимание, lambdaX возвращает правильный ответ, но я хочу избежать ненужного многократного вызова lambdaY .

Что мне нужно изменить в моем коде? (или лямбда-конфигурация)

Журналы:

Примечание: 2 журнала lambdaY вызываются одновременно.

enter image description here

Примечание: результаты LambdaX здоровы и, как и ожидалось. Нет дублирующего журнала.

enter image description here

1 Ответ

4 голосов
/ 03 февраля 2020

Ваш код неправильно использует AWS SDK. В частности, он использует и функции обратного вызова и обещания одновременно. Он должен использовать один или другой, но не оба.

Я бы поменял его на использование только обещания (и, очевидно, добавил бы к этому некоторую обработку ошибок):

const data = await lambda.invoke(params).promise();
const returnLoad = data.Payload;
...