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

时间:2018-05-14 13:04:13

标签: node.js firebase firebase-realtime-database google-cloud-functions

我的数据库结构是:

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

1 个答案:

答案 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);
  });