我的数据库结构是:
- Scores
- r5rwuerpepdsoazdf (user UID)
- scoreString: "5,12"
- j6fdasdfsdfs08fdd
- scoreString: "1,4,7"
我有一个云功能,可以在另一个节点(ScoreStacks)中写入值时更新特定用户UID的分数:
exports.updateScoreString =
functions.database.ref('/ScoreStacks/{uid}/{levelKey}/Score')
.onWrite((dataSnapshot, context) => {
const score = dataSnapshot.after.val();
const scoreStringRef = dataSnapshot.after.ref.root.child('Scores/' + context.params.uid + '/scoreString');
return scoreStringRef.transaction(scoreString => {
if (!scoreString) // transactions return null first time
{
return scoreString;
}
return scoreStringWithAddedScore(scoreString, score);
});
});
除了Scores节点中的UID尚不存在外,这一切都正常。然后什么都没发生 我想这很公平,因为scoreStringRef引用了一条不存在的路径。
那么如果UID不存在,如何确保在Scores节点中创建一个新条目呢?这一切都必须以原子方式完成。
答案 0 :(得分:1)
如果没有看到scoreStringWithAddedScore
,很难确定,但我怀疑你想要这个:
return scoreStringRef.transaction(scoreString => {
if (!scoreString) // transactions return null first time
{
scoreString = "";
}
return scoreStringWithAddedScore(scoreString, score);
});
更简洁(但如果您对此有新的解析,则更难解析)版本:
return scoreStringRef.transaction(scoreString => {
return scoreStringWithAddedScore(scoreString || "", score);
});