DynamoDb UpdateItem wird zweimal ausgeführt
Oct 24 2020
Wenn ich ein Element über update (updateItem) aktualisiere, wird die Update-Funktion zweimal aufgerufen und mein Wert wird zweimal addiert. Ich benutze async / await und es sollte funktionieren.
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;
}
Die Konsolenausgabe wird nur einmal gedruckt
###### updateDb
Aber das Ergebnis wird ausgegeben
console.log("updateDb:", JSON.stringify(data.Attributes, null, 2));
wird zweimal gedruckt und der Wert für die Dauer wird ebenfalls zweimal zu dem Wert aus der Datenbank addiert.
Es sollte nur einmal aufgerufen werden ... Bitte kennt jemand meinen Fehler hier?
Antworten
3 DoriAviram Oct 25 2020 at 08:11
Es sieht so aus, als ob Sie Methodenrückruf und Versprechen zusammen verwenden und versuchen, nur den Versprechen-Ansatz zu verwenden.
Ersetzen:
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();
Mit:
await ddb.update(param).promise().then(r => {
console.log("updateDb:", JSON.stringify(data.Attributes, null, 2))
}).catch(e => {
console.log("Error", e);
});
Ähnlich wie Node JS + AWS Promise Triggered Twice (nur im ses-Service)