代码之家  ›  专栏  ›  技术社区  ›  Bbx

在Firebase数据库云函数中,如何在列表中添加/替换项目

  •  0
  • Bbx  · 技术社区  · 7 年前

    我的数据库结构是:

    - 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节点中创建新条目?这一切都必须以原子的方式完成。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Frank van Puffelen    7 年前

    如果看不见,很难确定 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);
      });
    
    推荐文章