DynamoDb UpdateItem roda duas vezes
Oct 24 2020
Quando eu atualizo um item por meio de update (updateItem), a função de atualização é chamada duas vezes e meu valor é adicionado duas vezes. Eu uso async / await e deve 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;
}
A saída do console é impressa apenas uma vez
###### updateDb
Mas a saída do resultado
console.log("updateDb:", JSON.stringify(data.Attributes, null, 2));
é impresso 2 vezes e o valor da duração também é adicionado 2 vezes ao valor do db.
Deve ligar apenas uma vez ... Alguém sabe meu erro aqui?
Respostas
3 DoriAviram Oct 25 2020 at 08:11
Parece que é porque você usando o método de retorno de chamada e promessa juntos, tente usar apenas a abordagem de promessa.
Substituir:
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();
Com:
await ddb.update(param).promise().then(r => {
console.log("updateDb:", JSON.stringify(data.Attributes, null, 2))
}).catch(e => {
console.log("Error", e);
});
Também semelhante a Node JS + AWS Promise Triggered Twice (apenas no serviço SES)
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
Christopher Nolan uma vez se arrependeu de ter lido o 'roteiro de Pulp Fiction' de Quentin Tarantino