2017-05-04 4 views
0

Ich habe zwei DynamoDB-Tabellen, Tabelle1 und Tabelle2, mit einem Stream, der für Tabelle1 aktiviert ist. Beide haben einen String-Schlüssel namens "id". Ich habe auch eine Lambda-Funktion, die Einfügungen in Tabelle1 aus dem Stream liest und sie in Tabelle2 spiegelt, wenn sie bestimmte Kriterien erfüllen. Hier ist meine JS-Code (ES6 Syntax), die nicht ganz funktioniert:Was ist die einfachste Möglichkeit, ein Element aus einem DynamoDB-Stream in eine andere Tabelle zu kopieren?

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); 
      } 
     }); 
     });    
    } 

Mit dieser Funktion ergibt dieser Fehler:

One or more parameter values were invalid: Type mismatch for key id expected: S actual: M

Die Botschaft ist einfach genug zu interpretieren, aber ich bin verwirrt durch es da die ID, die ich verwende, sollte eine Zeichenfolge sein. Gibt es außerdem eine einfache Möglichkeit, den gesamten Artikel so wie er ist einzufügen?

Antwort

1

Das Problem bestand darin, dass der AWS-Dokumentclient Standard-JSON-Objekte erwartet, nicht die mit Anmerkungen versehenen AttributeValues, die direkt aus der DB kommen. Ich benutzte dynamodb-data-types, um die Daten auszupacken und alles funktionierte. Genauer gesagt, habe ich

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

und verändert dann die params

const params = { 
    TableName: table2, 
    Key: { 
     id: id, 
    }, 
    Item: attr.unwrap(input), 
}; 
Verwandte Themen