Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js AWS Lambda Dynamo更新不更新项目_Node.js_Amazon Web Services_Aws Lambda_Amazon Dynamodb - Fatal编程技术网

Node.js AWS Lambda Dynamo更新不更新项目

Node.js AWS Lambda Dynamo更新不更新项目,node.js,amazon-web-services,aws-lambda,amazon-dynamodb,Node.js,Amazon Web Services,Aws Lambda,Amazon Dynamodb,有一个名为Portal的DynamoDB表。 从节点中编写的Lambda函数中,我想更新一个项目的状态和ts字段(通过调用signalJobStart函数),并等待异步更新函数完成并给出承诺,然后继续。 由于某种原因,没有发生更新,但是在操作过程中没有引发错误。 日志中没有错误,我可以在日志中看到“FINISHED”日志消息 为什么表中的项目没有更改? 为什么我在日志中既看不到错误也看不到成功消息? (我也在没有承诺的情况下进行了尝试,得到了相同的结果。表项不会得到更新,甚至是异步更新。) 以下

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

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

(我也在没有承诺的情况下进行了尝试,得到了相同的结果。表项不会得到更新,甚至是异步更新。)

以下是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()
然后继续使用
。然后(…)
语句流使其工作。 就个人而言,我认为错误处理程序语法(用于
更新
)可能不会给您带来承诺

如果不起作用,请告诉我

我想你可以

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


如果不起作用,请告诉我

在您的查询中,
状态
保留关键字,并且在dynamodb中被禁止。因此,在查询中使用
ExpressionAttributeNames

也可以使用新承诺来处理承诺

请查看下面的帮助:

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 })
        }
      })
    });
  }
};
注意:请确认
accountid
entity
都是数据库中的


在您的查询中,
状态
保留关键字,并且在dynamodb中被禁止。因此,在查询中使用
ExpressionAttributeNames

也可以使用新承诺来处理承诺

请查看下面的帮助:

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 })
        }
      })
    });
  }
};
注意:请确认
accountid
entity
都是数据库中的


对我的情况有帮助的是:

  • 以异步/等待方式执行以下操作:

    exports.handler = async (event) => {
    ...
    let _result = "";
    try {
       _result = await docClient.update(_updateParams).promise();
    } catch(ex){
       _result = ex;
    }
    ..
    
  • 确保我写入的字段不是像以下情况一样的保留字(“数据”是保留字):

    要检查这一点:将列重命名为,比如说,“data2”-它没有问题

  • 确保您在IAM控制台的“执行角色”中拥有权限


  • 对我的情况有帮助的是:

  • 以异步/等待方式执行以下操作:

    exports.handler = async (event) => {
    ...
    let _result = "";
    try {
       _result = await docClient.update(_updateParams).promise();
    } catch(ex){
       _result = ex;
    }
    ..
    
  • 确保我写入的字段不是像以下情况一样的保留字(“数据”是保留字):

    要检查这一点:将列重命名为,比如说,“data2”-它没有问题

  • 确保您在IAM控制台的“执行角色”中拥有权限


  • 早些时候,我还尝试省略错误处理程序,结果相同(否)。现在我又搬走了,还是没有成功。刚刚更改为:让updatePromise=docClient.update(params.promise();你能确认在这种新的语法中,
    updatePromise
    不是一个承诺吗?这确实是一个很好的线索。我刚刚检查了一下,它是一个承诺,以
    promise{}
    的身份注销,尽管我怀疑它是挂起和超时的?早些时候,我还尝试了省略错误处理程序,结果是相同的(否)。现在我又搬走了,还是没有成功。刚刚更改为:让updatePromise=docClient.update(params.promise();你能确认在这种新的语法中,
    updatePromise
    不是一个承诺吗?这确实是一个很好的线索。我刚刚检查了一下,它是一个承诺,以
    promise{}
    的身份注销,尽管我怀疑它挂起了,并且超时?按照您的建议进行了更改,但仍然没有成功
    accountid
    是主分区键,而
    entity
    是表中的主排序键。不会引发任何错误。Lambda函数正在正常完成。最终完成的注释将被注销。请详细说明
    使用新承诺
    。打印
    控制台.log(“完成”)首先打印,因为它是异步的,所以不等待更新。你可以在那之后检查打印的内容。那之后什么都没有,只是完成了lambda。异步调用似乎处于挂起状态,可能未完成。只是我不知道为什么超时时没有错误。你能试着用我的新代码替换你的旧代码吗?按照你的建议,仍然没有成功
    accountid
    是主分区键,而
    entity
    是表中的主排序键。不会引发任何错误。Lambda函数正在正常完成。最终完成的注释将被注销。请详细说明
    使用新承诺
    。打印
    控制台.log(“完成”)首先打印,因为它是异步的,所以不等待更新。你可以在那之后检查打印的内容。那之后什么都没有,只是完成了lambda。异步调用似乎处于挂起状态,可能未完成。只是我不知道为什么超时时没有错误。你能试着用我的新代码替换你的旧代码吗