簡體   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