2

我有两个 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 应该是一个字符串。此外,是否有一种简单的方法可以按原样插入整个项目?

4

1 回答 1

1

问题是 AWS 文档客户端需要标准的 JSON 对象,而不是直接来自数据库的带注释的 AttributeValues。我使用dynamodb-data-types来解包数据并且一切正常。具体来说,我补充说

const attr = require('dynamodb-data-types').AttributeValue;

然后将参数更改为

const params = {
    TableName: table2,
    Key: {
      id: id,
    },
    Item: attr.unwrap(input),
 };
于 2017-05-04T21:17:46.620 回答