DynamoDb UpdateItem se ejecuta dos veces
Oct 24 2020
Cuando actualizo un elemento a través de update (updateItem), la función de actualización se llama dos veces y mi valor se agregará dos veces. Yo uso async / await y debería funcionar.
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;
}
La salida de la consola se imprime solo una vez
###### updateDb
Pero el resultado de la salida
console.log("updateDb:", JSON.stringify(data.Attributes, null, 2));
se imprime 2 veces y el valor de duración se agrega 2 veces también al valor del db.
Debería llamar una vez ... ¿Alguien sabe mi error aquí?
Respuestas
3 DoriAviram Oct 25 2020 at 08:11
Parece que se debe a que usa la devolución de llamada del método y la promesa juntos, intente usar solo el enfoque de promesa.
Reemplazar:
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();
Con:
await ddb.update(param).promise().then(r => {
console.log("updateDb:", JSON.stringify(data.Attributes, null, 2))
}).catch(e => {
console.log("Error", e);
});
También es similar a Node JS + AWS Promise Triggered Twice (solo en el servicio ses)