创建一个具有前10名用户的新根节点

时间:2018-10-25 19:44:27

标签: javascript node.js firebase cloud google-cloud-functions

我具有以下功能,该功能通过eanred_points对我的mobile_user表中的用户进行排名并为其分配等级。每当我调用http请求触发器时,都会执行此操作。

我要完成的工作是创建另一个名为排行榜的根节点,该根节点仅将前10位用户放在该节点中。

我当前的功能如下:

    exports.leaderboardUpdate2 = functions.https.onRequest((req, res) =>{
  var ref = admin.database().ref("/mobile_user");
    ref.orderByChild("earned_points").once("value", function(dataSnapshot) {
        var i = 0;
        dataSnapshot.forEach(function(childSnapshot) {
          var childRef = childSnapshot.ref;
          var r = (dataSnapshot.numChildren() - i);
          childRef.update({rank: r},function(error) {
              if (error != null)
                console.log("update error: " + error);
          });
          i++;
        });
    });
    res.status(200).send("Updated mobile users ranks");
});

我将如何去做?任何帮助或建议,我们感激不尽。

编辑:我的mobile_user表结构如下:enter image description here

1 个答案:

答案 0 :(得分:0)

我可能会做这样的事情:

const LEADERBOARD_CUTOFF = 10;

exports.leaderboardUpdate2 = functions.https.onRequest((req, res) =>{
  const updates = [];
  const leaderboard = {};

  const ref = admin.database().ref("/mobile_user");
  const leaderboardRef = admin.database().ref("/leaderboard");

  return ref.orderByChild("earned_points").once("value")
    .then(dataSnapshot => {
      let i = 0;
      dataSnapshot.forEach(function(childSnapshot) {
        const r = dataSnapshot.numChildren() - i;
        updates.push(childSnapshot.ref.update({rank: r}));
        if (r < LEADERBOARD_CUTOFF) {
          leaderboard[childSnapshot.key] = Object.assign(childSnapshot.val(), {rank: r});
        }
        i++;
      });

      updates.push(leaderboardRef.set(leaderboard)));
      return Promise.all(updates);
    }).then(() => {
      res.status(200).send("Updated mobile users ranks");
    }).catch((err) => {
      console.error(err);
      res.status(500).send("Error updating ranks.");
    });
});

与原始脚本的区别:

  1. 将更新汇总到一个数组中,并保留响应,直到更新完成为止。照原样,您可能最终会遇到错误,因为当HTTP响应发送时,该功能将限制CPU /网络,并且某些更新将无法通过。
  2. 将创建leaderboard对象,并在发生迭代时对其进行适当填充。 set()已添加到适当的引用上,作为函数中的最终更新。
  3. 始终使用承诺(它们更容易推论)。