NodeJS AWS Lambda Dynamo更新不会更新项目

e4yzc0pl  于 2023-01-20  发布在  Node.js
关注(0)|答案(4)|浏览(119)

有一个名为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");
}};
wlp8pajw

wlp8pajw1#

对我有帮助的是:
1.以异步/等待方式执行:

exports.handler = async (event) => {
...
let _result = "";
try {
   _result = await docClient.update(_updateParams).promise();
} catch(ex){
   _result = ex;
}
..

1.确保我写入的字段不是保留字,如下面的示例所示(“data”是保留字):

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

要对此进行检查:重命名列,比如说,“data 2”-它没有问题。
1.请确保您在IAM控制台的“执行角色”中具有权限。

tez616oj

tez616oj2#

我觉得你可以

docClient.update(params).promise()

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

icomxhvb

icomxhvb3#

在您的查询中statusreserve keywords并且在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

zkure5ic

zkure5ic4#

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

在参数中添加表达式属性名称:{“#状态”:“状态”、“#ts”:“ts”} 应该有效,对我有效

相关问题