#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.