передача JSON лямбда-функции в пределах - PullRequest
0 голосов
/ 13 октября 2018

Я пишу приложение без сервера, и у меня возникают проблемы при вызове лямбда-функции внутри функции.Две функции работают как положено по отдельности.когда я пытаюсь выполнить функцию B из функции A, это дает следующую ошибку.

Неожиданный токен в JSON в позиции 0

, вот мой код, и я уверен, что моя полезная нагрузка не передается второй функции, как я могу ее разрешить?Функция A

module.exports.create = (event, context, callback) => {
  console.log('inside');
  const timestamp = new Date().getTime();
  console.log(JSON.parse(event.body));
  const data = JSON.parse(event.body);

  var jsonObj = {'user_avatar' : 'data.user_avatar',
                'name' : 'data.name'}
  const params2 = {
  FunctionName: "serverless-rest-api-with-dynamodb-dev-uploadImage",
  InvocationType: "RequestResponse",
  LogType: 'Tail',
  Payload: JSON.stringify(jsonObj)
  };

  lambda.invoke(params2, function (err, data) {
  if (err) {
    console.log('error : ' + err)
    callback(err, null)
  } else if (data) {
    const response = {
      statusCode: 200,
      body: JSON.parse(data.Payload)
    }
    callback(null, response)
  }
})

  const params = {
    TableName: process.env.BANK_TABLE,
    Item: {
      id: uuid.v1(),
      bankName: data.bankName,
      bankUrl: data.bankUrl,
      bankCardUrl: data.bankCardUrl,
      bankLogoID: data.bankLogoID,
      createdAt: timestamp,
      updatedAt: timestamp,
    },
  };

  // write the offers to the database
  dynamoDb.put(params, (error) => {
    // handle potential errors
    if (error) {
      console.error(error);
      callback(null, {
        statusCode: error.statusCode || 501,
        headers: { 'Content-Type': 'text/plain' },
        body: 'Couldn\'t create the offer item.',
      });
      return;
    }
    console.log('setting callback');
    // create a response
    const response = {
      statusCode: 200,
      body: JSON.stringify(params.Item),
    };
    callback(null, response);
  });
};

Функция B

module.exports.create = (event, context, callback) => {
  console.log('staring');
    console.log(JSON.parse(event.body));
     let encodedImage =JSON.parse(event.body).user_avatar;
     let decodedImage = Buffer.from(encodedImage, 'base64');
     var filePath = "avatars/" + JSON.parse(event.body).name + ".jpg"
     var params = {
       "Body": decodedImage,
       "Bucket": "imageuploads",
       "Key": filePath
    };
    s3.upload(params, function(err, data){
       if(err) {
           callback(err, null);
       } else {
           let response = {
        "statusCode": 200,
        "headers": {
            "my_header": "my_value"
        },
        "body": JSON.stringify(data),
        "isBase64Encoded": false
    };
           callback(null, response);
    }
    });

};

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

Если вы вызываете свою лямбда-функцию изнутри (например, для модульного теста), вам следует убедиться, что вы отправляете ее в формате json http.

create({body: JSON.stringify(myBodyObject)}, null, callBack)
0 голосов
/ 15 октября 2018

Вы должны изменить тело запроса.

const data = JSON.parse(event.body);

var jsonObj = {
  body: { //add body
    'user_avatar': data.user_avatar, //remove single quotes
    'name': data.name //remove single quotes
  }
}
const params2 = {
  FunctionName: "serverless-rest-api-with-dynamodb-dev-uploadImage",
  InvocationType: "RequestResponse",
  LogType: 'Tail',
  Payload: JSON.stringify(jsonObj)
};

lambda.invoke(params2, function(err, data) {
  if (err) {
    console.log("error : " + err);
    callback(err, null);
  } else if (data) {
    const response = {
      statusCode: 200,
      body: JSON.parse(data.Payload)
    };
    callback(null, response);
  }
});
0 голосов
/ 13 октября 2018

Проблема в полезной нагрузке, которую вы отправляете из А в Б.

(обратите внимание, что JSON.parse(undefined) почти всегда является виновником SyntaxError: Unexpected token u in JSON at position 0).

Функция B,В строке 3 написано: console.log(JSON.parse(event.body));

Однако ваша полезная нагрузка из A (A, строка 12): {'user_avatar' : 'data.user_avatar', 'name' : 'data.name'}.

Это означает, что event = JSON.stringify({'user_avatar' : 'data.user_avatar', 'name' : 'data.name'}) и event.body === undefined, что почему когда вы пытаетесь и JSON.parse(event.body) получаете сообщение об ошибке.

Чтобы сделать это, вам нужно изменить строку 7 на:

var jsonObj = { body: { user_avatar: 'data.user_avatar', name: 'data.name' } };

Я подозреваю, что этоработает, когда вы вызываете отдельно, потому что вы либо вызываете с помощью API Gateway (который имеет форму события { body: ...data }, либо ваше тело теста в консоли имеет нечто похожее.)

...