繁体   English   中英

AWS Lambda Dynamo 更新不更新项目

[英]AWS Lambda Dynamo update does not update the item

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

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

(我也试过没有 promise,结果相同。表项没有更新——甚至是异步的。)

这是来自 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");
}};

我想你可以

docClient.update(params).promise()

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

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

什么对我有帮助:

  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 控制台的“执行角色”中拥有权限。

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

也使用 new 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

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

在参数中添加ExpressionAttributeNames: { "#status": "status", "#ts": "ts" }它应该工作,对我有用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM