Ответ лямбда-функции AWS, вызванной другой лямбда-функцией, всегда равен нулю - PullRequest
0 голосов
/ 05 июля 2018

У меня есть две лямбда-функции, и мне нужно вызвать функцию с именем sendHealthData из функции с именем receiveHealthData. Я использую Node.JS 8.10 и Serverless framework.

Вот код для receiveHealthData:

const env = process.env;
const aws = require("aws-sdk");
const Lambda = new aws.Lambda();
const S3 = new aws.S3();

exports.main = (event, context, callback) => {

    const params = {
        FunctionName: "sendHealthData",
        InvocationType: "RequestResponse",
        Payload: JSON.stringify(event)
    }

    Lambda.invoke(params, function(error, remainingHealthData) {

        if (error) {

            reject(error);
        }
        else {

            console.log("Remaining: " + remainingHealthData["Payload"]);

            if (!remainingHealthData["Payload"]) {

                reject(new Error("Payload is null"));
            }  
            else {

                resolve(remainingHealthData);
            }
        }
    });
}

А это sendHealthData:

exports.main = async (event, context, callback) => {

    callback(null, "Sent Health Data!");
}

remainingHealthData["Payload"] равен нулю каждый раз.

Выход console.log(JSON.stringify(remainingHealthData)):

{"StatusCode":200,"Payload":'null'}

Когда я вызываю sendHealthData - serverless invoke --function sendHealthData, я получаю ожидаемый результат: «Отправленные данные о здоровье!»

Я получил ожидаемый ответ только один раз: когда я изменил время ожидания функции sendHealthData. Но странно то, что я изменил его на меньшее значение. Это было 10, и я изменил его на 6.

1 Ответ

0 голосов
/ 05 июля 2018

Проблема в том, что вы используете RequestResponse в качестве InvocationType, но ваша sendHealthData AWS Lambda не возвращает действительный JSON (просто строка).

Небольшая цитата из документации гласит:

Полезная нагрузка - (буфер, типизированный массив, BLOB-объекты, строки)

Это JSON-представление объекта, возвращаемое функцией Lambda. Это присутствует, только если тип вызова - RequestResponse.

Поэтому, как только вы измените возвращаемое значение вашей sendHealthData AWS Lambda на следующее, оно должно работать так, как вы ожидаете:

exports.main = async (event, context, callback) => {
  callback(null, {
    "message": "Sent Health Data!"
  });
}
...