Firebase数据库云函数:如何原子化创建或更新用户分数条目(含无UID场景)
原子化创建并更新Firebase用户分数条目
你的问题根源在于事务逻辑里,当目标用户的scoreString不存在(也就是Scores节点下还没有这个UID的条目)时,你直接返回了null,没有主动初始化新的分数数据。Firebase的事务在首次处理不存在的路径时,确实会传入null作为初始值,这时候我们需要在事务内部处理这种情况,才能保证原子化地创建或更新数据。
修改后的云函数代码
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 => { // 如果scoreString不存在(用户UID还没有条目),就用当前分数初始化 if (!scoreString) { return score.toString(); } // 否则调用你的函数追加分数 return scoreStringWithAddedScore(scoreString, score); }); });
关键说明
- 事务的原子性保证:Firebase的事务会自动处理并发情况,不管是创建新条目还是更新已有条目,整个操作都是原子化的——要么完全成功,要么完全失败,不会出现半完成的状态。
- 初始化逻辑:当
scoreString为null时,我们直接将当前的score转为字符串作为初始值,这样就会自动在Scores节点下创建该UID的条目,并设置scoreString字段。 - 兼容原有逻辑:如果用户UID已经存在,依然会执行你原来的
scoreStringWithAddedScore逻辑,追加新的分数。
这样修改后,不管目标用户的分数条目是否存在,云函数都能正确完成原子化的创建或更新操作。
内容的提问来源于stack exchange,提问作者Bbx
相关产品推荐
相关产品推荐

