我试图弄清楚如何通过AWS中的API网关将动态数据插入到dynamodb表中。目前我有一个dynamodb表和一个API端点设置,可以接受这样的POST。
POST https:// {unique-id} .execute-api.us.east-1.amazonaws.com / notification / events
{
"reference_number": 99,
"purchase_date": "1/1/2017"
}
我已在API网关中设置了一个正文映射模板,以将数据按摩到dynamodb中。
{
"TableName": "Events",
"Item": {
"reference_number": {
"N": "$input.path('$.reference_number')"
},
"purchase_date": {
"S": "$input.path('$.purchase_date')"
}
}
}
以上工作并保存到表中。
假设我将事件哈希添加到我的json(可以根据事件更改)。
{
"reference_number": 99,
"purchase_date": "1/1/2017",
"event": {
"name": "purchase",
"items": [1,3,6],
"info": {
"currencyID": "USD",
"countryID": "US"
}
}
}
如何使用API网关主体映射模板语法将事件属性保存到dynamodb中的Map?
{
"TableName": "Events",
"Item": {
"reference_number": {
"N": "$input.path('$.reference_number')"
},
"purchase_date": {
"S": "$input.path('$.purchase_date')"
},
"event":{
"M": "$input.path('$.event')"
}
}
}
上面的模板给出了以下错误。 "预期地图或null"
答案 0 :(得分:1)
看起来DynamoDB API实际上需要一个' M'属性为event
的地图。很遗憾,您无法通过原始JSON。您必须手动映射整个event
对象才能使DDB API满意。
一种可能的解决方法是对S
对象进行字符串化并将其写为类型{
"TableName": "Events",
"Item": {
"reference_number": {
"N": "$input.path('$.reference_number')"
},
"purchase_date": {
"S": "$input.path('$.purchase_date')"
},
"event":{
"S": "$util.escapeJavaScript($input.json('$.event'))"
}
}
}
,但这当然要求读者期望这种行为。
const from = new Date();
console.log(from);
答案 1 :(得分:1)
看起来你终于做到了。我认为最好的选择是在API和dynamoDB之间创建一个简单的lambda函数。将映射工作留给aws-sdk。
在这种情况下,API网关中的正文映射模板就像这样简单:
$input.body
功能不会复杂得多。我使用了javascript函数:
var AWS = require("aws-sdk");
var docClient = new AWS.DynamoDB.DocumentClient();
var tableName = "tableName";
var saveData = function (data) {
var params = {
TableName: tableName,
Item: data
};
docClient.put(params, function (err, data) {
if (err) {
console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
} else {
console.log("Added item:", JSON.stringify(data, null, 2));
}
});
};
exports.handler = function (event) {
try {
console.log("Processing event: ", event);
saveData(event);
} catch (e) {
console.error("Processed unsuccessfully", e, e.stack);
}
};
答案 2 :(得分:0)
对于我的要求(保存输入正文),映射模板是
"rawdata": {
"M": $input.body
}
请注意,输入正文没有引号。
数据应采用Dynamodb格式,例如
{"username":{"S":"Vishnu"}}
您可以使用js lib(如dynamodb-marshaller)将json转换为Dynamodb格式。希望这会有所帮助。