2016-05-17 9 views
2

Lambda(ノード)を使用してDynamoDBのレコードを更新しようとしています。 paramsの構造を変更してExpected params.ExpressionAttributeValues[':done'] to be a structureのようなエラーが出るので、DynamoDBと通信していると思います。それは問題が何であるかを知ることは難しいので、そこからAWS Lambda(ノード)を使用するAWS DynamoDBのUpdateItem

{ 
    "TableName": "test_table", 
    "Key": { 
     "id": { 
      "S": "90c31f23-96e3-4d5d-b08d-95aafb9bed2e" 
     } 
    }, 
    "UpdateExpression": "SET done = :done", 
    "ExpressionAttributeValues": { 
     ":done": { 
      "S": "t" 
     } 
    }, 
    "ReturnValues": "UPDATED_NEW" 
} 

出て、それだけの時間:

この

はのparamsです。

これは、完全なラムダ関数である:

var aws = require('aws-sdk'); 
var dynamodb = new aws.DynamoDB({ 
    apiVersion: '2012-08-10', 
    accessKeyId: 'xxx', 
    secretAccesskey: 'xxx', 
    region: 'us-west-2' 
}) 

exports.handler = (event, context, callback) => { 
    console.log('Incoming: ', event); 

    var table = "test_table"; 

    event.Records.forEach((record) => { 
     console.log('DynamoDB Record: %j', record.dynamodb); 

     var params = { 
     TableName: table, 
     Key: { 
      "id": record.dynamodb.Keys.id 
     }, 
     UpdateExpression: "SET done = :done", 
     ExpressionAttributeValues: { 
      ":done": { "S": "t" } 
     }, 
     ReturnValues: "UPDATED_NEW" 
     }; 

     console.log("params: %j", params); 

     dynamodb.updateItem(params, function(err, data) { 
     if (err) console.log("Unable to update item. Error: ", JSON.stringify(err, null, 2)); 
     else console.log("Updated item succeeded: ", JSON.stringify(data, null, 2)); 
     }); 
    }); 
    callback(null, "Successfully processed ${event.Records.length} records."); 
}; 
+0

は、それが正しいですかメッセージは表を作成するのではなく、文書を既存の表に更新することを目的としていますか?もしそうなら、あなたはテーブル情報を作成してください。 – aug2uag

+0

私はテーブルを作成するダイナミクス付きのレールを使用しています。特にあなたが疑問に思っているものはありますか? – Archonic

+0

スキーマは厳密に一致している必要があります。[低レベルのシステム]をチェックしてください(http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.LowLevel .Walkthrough.html) – aug2uag

答えて

3

ドキュメントによると、あなたは、ドキュメントのクライアントを持っている必要があり、そしてあなたのフロー制御を改善したい。..

var aws = require('aws-sdk'); 
var dynamodb = new aws.DynamoDB({ 
    apiVersion: '2012-08-10', 
    accessKeyId: 'xxx', 
    secretAccesskey: 'xxx', 
    region: 'us-west-2' 
}) 

exports.handler = (event, context, callback) => { 
    console.log('Incoming: ', event); 

    var table = "test_table"; 
    var docClient = new dynamodb.DocumentClient() 

    function async(record, next) { 
     var params = { 
      TableName: table, 
      Key: { 
       "id": record.dynamodb.Keys.id 
      }, 
      UpdateExpression: "SET done = :done", 
      ExpressionAttributeValues: { 
       ":done": { "S": "t" } 
      }, 
      ReturnValues: "UPDATED_NEW" 
     }; 

     console.log("params: %j", params); 

     docClient.updateItem(params, function(err, data) { 
      if (err) console.log("Unable to update item. Error: ", JSON.stringify(err, null, 2)); 
      else console.log("Updated item succeeded: ", JSON.stringify(data, null, 2)); 
      next() // modify for err handling 
     }); 
    } 
    function final() { callback(null, "Successfully processed ${event.Records.length} records."); } 

    var results = []; 

    event.Records.forEach(function(item) { 
     async(item, function(){ 
      results.push(true); 
      if(results.length == event.Records.length) final(); 
     }); 
    }); 
}; 
+0

現在、私は 'TypeError:dynamodb.DocumentClient is not function'を取得しています。それを修正するのは難しくありません。 – Archonic

+0

そして、それは 'TypeError:docClient.updateItemは関数ではありません' -_-です。 'docClient.update'はエラーをスローしませんが、タイムアウトします。 – Archonic

+0

Amazonにリクエストしていますか? – aug2uag

関連する問題