Получение данных из действия ввода DynamoDB

#javascript #amazon-web-services #aws-lambda #amazon-dynamodb

#javascript #amazon-веб-сервисы #aws-лямбда #amazon-dynamodb

Вопрос:

У меня есть простая лямбда-функция для записи в DynamoDB. Я пытаюсь получить доступ к данным, которые только что были записаны в базу данных, чтобы вернуть их клиенту и подтвердить успех.

Код выглядит следующим образом:

 'use strict';

//  Config 
var AWS = require('aws-sdk');

/* Expected JSON Event
{
  "operation": "create",
  "tableName": "materials",
  "payload": {
    "TableName": "materials",
    "Item": {
      "materialType": "permanent",
      "materialId": "1000",
      "materialName": "DCP Anchor",
      "dimensions": {
        "height": 100,
        "width": 65,
        "diameter": 75
      }
    }
  }
}

 * Provide an event that contains the following keys:
 *
 *   - operation: one of the operations in the switch statement below
 *   - tableName: required for operations that interact with DynamoDB
 *   - payload: a parameter to pass to the operation being performed
 */

//  POST request is in event. We use callback to send the return to client
exports.handler = async (event, context) => {

    //console.log('Received event:', JSON.stringify(event, null, 2));
    var dynamo = new AWS.DynamoDB.DocumentClient();
    
    //  Hardcode Table Name
    var tableName = "materials";
    event.payload.TableName = tableName;

    let responseBody = null;
    let statusCode = null;

    switch (event.operation) {
        case 'create':
            try {
                const data = await dynamo.put(event.payload).promise();
                responseBody = JSON.stringify(data)
                statusCode = 201;
            } catch (err){
                responseBody = `Unable to put: ${err}`;
                statusCode = 403;
            }

            const response = {
                statusCode,
                headers: {
                    "Content-Type" : "application/json"
                },
                body: responseBody
            };

            return response;
        default:
            return (`Unknown operation: ${event.operation}`);
    }
};
                    
  

Кажется, я не могу захватить записанные данные и передать их в переменную ResponseBody здесь:

     const data = await documentClient.put(params).promise();
    responseBody = JSON.stringify(data);
  

У меня такое чувство, что я неправильно использую функцию async, но я в тупике

Комментарии:

1. Привет, Найл Паркер. Пожалуйста, проверьте ответ и отметьте вопрос как ответ, если это так. Спасибо!

Ответ №1:

В документации AWS вы можете увидеть эту опцию:

 ReturnValues: NONE | ALL_OLD | UPDATED_OLD | ALL_NEW | UPDATED_NEW
  

Вы можете попробовать с этим, но я не уверен, что он работает правильно PutItem . В последний раз, когда я его проверял, он работает только на UpdateItem .

Единственный надежный способ получить ваш вставленный объект — это GetItem после PutItem , но я думаю, что это лучшее решение.

Когда вы вставляете данные в базу данных, у вас уже есть данные, которые будут вставлены. Таким образом, вы можете вернуть эти данные клиенту.

Так что, может быть, будет лучше, если вы будете использовать этот способ.

Кроме того, я советую вам использовать модели для DynamoDB.