【问题标题】:AWS Lambda Dynamo update does not update the itemAWS Lambda Dynamodb 更新不更新项目
【发布时间】:2019-11-25 11:08:43
【问题描述】:

有一个名为 Portal 的 DynamoDB 表。 从节点中编写的 Lambda 函数中,我想更新项目的 statusts 字段(通过调用 signalJobStart 函数)并等待异步更新函数完成之前的承诺继续。 由于某种原因,没有发生更新,但是在操作过程中没有引发错误。 日志中没有错误,我可以在日志中看到“已完成”的日志消息。

为什么表格中的项目没有变化? 为什么我在日志中既看不到错误也看不到成功消息?

(我也尝试过没有承诺,但结果相同。表格项没有更新 - 甚至是异步的。)

这是来自 Lambda 的代码:

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region: 'eu-west-1'});

module.exports = {
signalJobStart: function(accountId, jobId) {
    console.log("Signaling job start for account %s and job %s", accountId, jobId);

    let table = "Portal";

    let params = {
        TableName: table,
        Key:{
            "accountid": accountId,
            "entity": jobId
        },
        UpdateExpression: "SET status = :s, ts = :t",
        ExpressionAttributeValues:{
            ":s": "running",
            ":t": Date.now()
        },
        ReturnValues:"UPDATED_NEW"
    };

    let updatePromise = docClient.update(params, function(err, data) {
        if (err) {
            console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
        } else {
            console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
        }
    }).promise();

    updatePromise.then(function(data) {
      console.log('Success');
    }).catch(function(err) {
      console.log(err);
    });

    console.log("FINISHED");
}};

【问题讨论】:

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


    【解决方案1】:

    对我有什么帮助:

    1. 以异步/等待方式执行:

      exports.handler = async (event) => {
      ...
      let _result = "";
      try {
         _result = await docClient.update(_updateParams).promise();
      } catch(ex){
         _result = ex;
      }
      ..
      
    2. 确保我正在写入的字段不是保留字,如下例所示(“数据”是保留字):

      {
      ..
      UpdateExpression: "set data = :newdata",
      ExpressionAttributeValues: {
      ":newdata": "blah"
      },
      ..
      

      要检查这一点:将列重命名为“data2” - 没有问题。

    3. 确保您在 IAM 控制台的“执行角色”中具有权限。

    【讨论】:

      【解决方案2】:

      我觉得可以

      docClient.update(params).promise()
      

      然后继续使用.then(...) 语句流使其工作。 就个人而言,我认为错误处理程序语法(用于update)可能不会给您一个承诺。

      如果这不起作用,请告诉我。

      【讨论】:

      • 之前我也尝试过省略错误处理程序,结果相同(否)。现在我再次删除,仍然没有成功。刚改成这个:let updatePromise = docClient.update(params).promise();
      • 你能确认在这个新语法中updatePromise 不是一个承诺吗?
      • 这确实是一个很好的线索。我刚刚检查了一下,这是一个承诺,以Promise { <pending> } 的身份注销,尽管我怀疑它正在等待和超时?
      【解决方案3】:

      在您的查询中status保留关键字,并且在dynamodb 中被禁止。所以在你的查询中使用ExpressionAttributeNames

      同样使用新的 Promise 来处理 promise

      请查看下方对您的帮助:

      module.exports = {
        signalJobStart: function (accountId, jobId) {
          return new Promise(function (resolve, reject) {
            console.log("Signaling job start for account %s and job %s", accountId, jobId);
      
            let table = "Portal";
      
            let params = {
              TableName: table,
              Key: {
                "accountid": accountId,
                "entity": jobId
              },
              UpdateExpression: "SET #status = :s, ts = :t",
              ExpressionAttributeNames: {
                '#status': 'status'
              },
              ExpressionAttributeValues: {
                ":s": "running",
                ":t": Date.now()
              },
              ReturnValues: "UPDATED_NEW"
            };
      
            docClient.update(params, function (err, data) {
              if (err) {
                console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
                reject(err)
              } else {
                console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
                resolve({ message: 'sucsss', data: data })
              }
            })
          });
        }
      };
      

      注意:还请确认accountidentity 在您的数据库中都是Key

      【讨论】:

      • 按照您的建议进行了更改,仍然没有成功。 accountid 是主分区键,而entity 是表中的主排序键。
      • 未引发错误。 Lambda 函数刚刚正常完成。最后的 FINISHED 评论被注销。请详细说明use new Promise
      • 当您打印 console.log("FINISHED"); 时,它首先打印,因为它是异步的,所以不要等待更新。之后您可以检查打印的内容。
      • 之后什么都没有,只是完成了 lambda。看起来异步调用正在挂起并且可能没有完成。只是我不确定为什么超时没有错误。
      • 你能不能试着用我的新代码替换你的旧代码
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2017-03-01
      • 2019-02-16
      • 1970-01-01
      相关资源
      最近更新 更多