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

时间:2018-10-13 13:10:03

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

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

3 个答案:

答案 0 :(得分:0)

我认为您可以

docClient.update(params).promise()

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

让我知道是否行不通。

答案 1 :(得分:0)

查询中的meson.add_project_link_arguments()保留关键字,并且在 dynamodb 中是禁止的。因此,在查询中使用status

  

还使用新的Promise实现承诺

请在其帮助下查看以下内容:

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

答案 2 :(得分:0)

对我来说有什么帮助:

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

    exports.handler = async (event) => {
    ...
    let _result = "";
    try {
       _result = await docClient.update(_updateParams).promise();
    } catch(ex){
       _result = ex;
    }
    ..
    
  2. 确保我要写入的字段不是保留字,例如以下情况(“ data”是保留字):

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

    要进行检查:将列重命名为“ data2”-没问题。

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