我有两个dynamoDB表,table1和table2,在table1上启用了一个流。两者都有一个名为" id"的字符串键。我还有一个lambda函数,它从流中读取对table1的插入,如果满足某些条件,则将它们镜像到table2。这是我的JS代码(ES6语法),它不起作用:
const dynamoDb = new AWS.DynamoDB.DocumentClient();
function mirrorInserts(event, context, callback) {
event.Records.forEach((record) => {
if (record.eventName != 'INSERT') {
console.log('Ignored ' + record.eventName + ' stream event.');
return;
}
var input = record.dynamodb.NewImage;
var id = input.id.S
if (myCondition(input)( {
const params = {
TableName: table2,
Key: {
id: id,
},
Item: input,
};
dynamoDb.put(createParams, (result, error) => {
if (error) {
console.error(error);
}
});
});
}
使用此功能会出现此错误:
一个或多个参数值无效:键ID的类型不匹配 预期:S实际:M
这条信息很容易解释,但我很困惑,因为我使用的id应该是一个字符串。另外,是否有一种简单的方法可以按原样插入整个项目?
答案 0 :(得分:1)
问题是AWS文档客户端需要标准的JSON对象,而不是直接来自DB的带注释的AttributeValues。我使用dynamodb-data-types来解包数据,一切正常。具体来说,我添加了
const attr = require('dynamodb-data-types').AttributeValue;
然后将参数更改为
const params = {
TableName: table2,
Key: {
id: id,
},
Item: attr.unwrap(input),
};