【问题标题】:UpdateItem in AWS DynamoDB using AWS Lambda (node)使用 AWS Lambda(节点)在 AWS DynamoDB 中更新项目
【发布时间】:2016-05-17 10:04:09
【问题描述】:

我正在尝试使用 Lambda(节点)更新 DynamoDB 中的记录。我可以更改params 的结构并得到类似Expected params.ExpressionAttributeValues[':done'] to be a structure 的错误,所以我相信它正在与DynamoDB 通信。

这是参数:

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

从那里它只是超时,所以很难知道问题是什么。

这是完整的 lambda 函数:

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

【问题讨论】:

  • 消息不是用来创建表格,而是将文档更新为预先存在的表格,这是否正确?如果是这样,请您包括创建表信息
  • 我正在使用带有 dynamoid 的导轨来创建表格。您有什么特别想知道的吗?
  • 模式是严格的,从外观判断它需要完全匹配..查看low level type system

标签: node.js amazon-dynamodb aws-lambda


【解决方案1】:

根据文档,您必须拥有一个文档客户端,并完善您的流程控制..

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

【讨论】:

  • 目前我收到TypeError: dynamodb.DocumentClient is not a function。应该不难解决。
  • 现在是TypeError: docClient.updateItem is not a function -_-。 docClient.update 不会抛出错误但会超时。
  • 你能看到它向亚马逊请求吗?
  • 我认为文档客户端需要var AWS = require("aws-sdk"), docClient = new AWS.DynamoDB.DocumentClient();,并且updateItem应该存在..
  • 原来exports.handler..之外的代码都没有运行。我已经在该块之外看到了很多关于 AWS 和 DynamoDB 实例化的示例,但是将其移入内部可以正常工作。我很快就会发布一个要点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 2015-11-02
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多