UpdateItem DynamoDb berjalan dua kali

Oct 24 2020

Ketika saya mengupdate item melalui update (updateItem) maka fungsi update dipanggil dua kali dan nilai saya akan ditambahkan dua kali. Saya menggunakan async / await dan seharusnya berfungsi.

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

Output konsol hanya dicetak satu kali

###### updateDb

Tapi hasilnya keluaran

 console.log("updateDb:", JSON.stringify(data.Attributes, null, 2));

dicetak 2 kali dan nilai durasi ditambahkan 2 kali juga ke nilai dari db.

Seharusnya hanya menelepon satu kali ... Tolong ada yang tahu kesalahan saya di sini?

Jawaban

3 DoriAviram Oct 25 2020 at 08:11

Sepertinya ini karena Anda menggunakan metode callback dan promise bersama, coba gunakan hanya pendekatan promise.

Menggantikan:

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();

Dengan:

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

Juga mirip dengan Node JS + AWS Promise Triggered Twice (hanya dalam layanan ses)