DynamoDb UpdateItem 运行两次

Sle*_*Fox 1 amazon-web-services node.js amazon-dynamodb aws-lambda

当我通过 update (updateItem) 更新项目时,更新函数会被调用两次,我的值将被添加两次。我使用 async/await ,它应该可以工作。

var ddb = new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10' });

async function updateUserGame(tablePostfix, gameId, durationinMin) {
    console.log("###### updateUserGame")

    var tableUserGames = tableUserGamesWithoutPostfix + tablePostfix;

    expressions = {
        ":duration": parseInt(durationinMin)
    }
    updateExpressions = "set playDuration = playDuration + :duration";

    var params = {
        TableName: tableUserGames,
        Key: {
            id: parseInt(gameId)
        },
        ExpressionAttributeValues: expressions,
        UpdateExpression: updateExpressions,
        ReturnValues: "ALL_NEW"
    };

    return await updateDb(params);
}

async function updateDb(params) {
    console.log("###### updateDb")
    var savedItem;

    // Call DynamoDB to add the item to the table
    await ddb.update(params, function(err, data) {
            if (err) {
                console.log("Error", err);
            } else {
                console.log("updateDb:", JSON.stringify(data.Attributes, null, 2));

                savedItem = data.Attributes;
            }
        }).promise();

    return savedItem;
}
Run Code Online (Sandbox Code Playgroud)

控制台输出仅打印一次

###### updateDb

但输出的结果

 console.log("updateDb:", JSON.stringify(data.Attributes, null, 2));
Run Code Online (Sandbox Code Playgroud)

打印 2 次,持续时间值也添加到数据库中的值 2 次。

它应该只调用一次...请问有人知道我的错误吗?

小智 5

看起来像是因为您同时使用方法回调和 Promise,请尝试仅使用 Promise 方法。

代替:

await ddb.update(params, function(err, data) {
    if (err) {
        console.log("Error", err);
    } else {
        console.log("updateDb:", JSON.stringify(data.Attributes, null, 2));
        savedItem = data.Attributes;
    }
}).promise();
Run Code Online (Sandbox Code Playgroud)

和:

await ddb.update(param).promise().then(r => {
    console.log("updateDb:", JSON.stringify(data.Attributes, null, 2))
}).catch(e => {
    console.log("Error", e);
});
Run Code Online (Sandbox Code Playgroud)

也类似于Node JS + AWS Promise Triggered Twice(仅在 ses 服务中)