Добавление нескольких карт в список с использованием DynamoDb, Lambda, Api Gateway - PullRequest
0 голосов
/ 26 ноября 2018

Я передаю параметры в Api Gateway для сохранения в DynamoDB с помощью AWS Lambda Node JS.

Запрос на интеграцию Api Gateway:

#set($inputRoot = $input.path('$'))
{
  "name" : "$inputRoot.name",
  "profileImage": "$inputRoot.profileImage",
  "gender" : "$inputRoot.gender",
  "interests": #foreach ( $item in ["$inputRoot.interests"] ) $item #end,
  "surveyOne": "$inputRoot.surveyOne",
  "surveyOneAnswer": "$inputRoot.surveyOneAnswer",
  "surveyTwo": "$inputRoot.surveyTwo",
  "surveyTwoAnswer": "$inputRoot.surveyTwoAnswer"
}

Содержимое AWS Lambda (Node JS) для получения параметров и их сохранения в DynamoDB:

const params = {
    Item: {
      'uuid': { S: "i_" + uuidv4() }, 
      'name': { S: event.name }, 
      'profileImage': { S: event.profileImage },
      'gender': { S: event.gender },
      'interests': { SS: event.interests },
      'surveys' : {
        L: [
          { 
            M: {
              'type': { S: event.surveyOne },
              'answer': { S: event.surveyOneAnswer },
            },
            M: {
              'type': { S: event.surveyTwo },
              'answer': { S: event.surveyTwoAnswer }
            }
          }
        ]
      }
     }, 
     TableName: 'users'
   };

   dynamodb.putItem(params, (err, data) => {
     if (err) {
      const response = {
        statusCode: 500, 
        headers: {
          'Access-Control-Allow-Origin': '*'
        },
        body: JSON.stringify({status: false})
      };
      return callback(null, response);  
    } 

    // return status 200 if success
    const response = {
      statusCode: 200, 
      headers: {
        'Access-Control-Allow-Origin': '*'
      },
      body: JSON.stringify({status: 'A new record has been added'})
    };
    return callback(null, response);

   })

Но сохраненный элемент в базе данных Dynamo содержит один опрос , который является surveyTwo .Это должно быть 2, потому что я передал surveyOne и surveyTwo, введите и ответ.

Мой ожидаемый результат должен быть

{
  "name": "John Doe",
  "profileImage": "https://example.com", 
  "gender": "m", 
  "interests": ["Basketball",  "Swimming"],
  "surveys": [
    { "type": "question 1", "answer": "answer to question 1" },
    { "type": "question 2", "answer": "answer to question 2" }
  ]
}

1 Ответ

0 голосов
/ 27 ноября 2018

Я бы порекомендовал использовать DynamoDb DocumentClient Class.

Вы можете предоставить те же параметры, но с собственными типами JS.

DocumentClient выполняет сортировку ибесполезно для вас, что может быть проблемой с вашим опросом.

Ваш пример будет выглядеть примерно так:

var params = {
 TableName : 'users',
 Item: {
     uuid: 'i_' + uuidv4(),
     name: event.name,
     surveys: [
        {type: event.surveyOne, answer: event.surveyOneAnswer},
        {type: event.surveyTwo, answer: event.surveyTwoAnswer}]
     }
};

var documentClient = new AWS.DynamoDB.DocumentClient();

  documentClient.put(params, function(err, data) {
 if (err) console.log(err);
 else console.log(data);
});
...