我的数据库结构是:
- 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); }); });
除了分数节点中的UID还不存在之外,这一切都可以正常工作。然后什么都没发生。 我想这很公平,因为scoreStringRef引用的是一条不存在的路径。
那么,如果UID还不存在,我如何确保在Scores节点中创建新条目?这一切都必须以原子的方式完成。
如果看不见,很难确定 scoreStringWithAddedScore ,但我怀疑你想要这个:
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); });