【问题标题】:How to copy a childNode from one node to another?如何将 childNode 从一个节点复制到另一个节点?
【发布时间】:2017-05-15 02:00:49
【问题描述】:

情况:

我需要下载 childNode,然后将它 set() 到另一个节点中。

问题是我只想在 childNode 的 score 属性达到 100 时执行此操作。

我应该在何时何地检查帖子的分数是否为 100 或更高,我如何将它们仅复制到新索引一次?


我的想法:

加载帖子后,检查它的分数。如果它> = 100,如果是这种情况,请检查数据库。然后将节点推送到新索引。


问题:

如何防止每次加载帖子时上传节点,因为它的分数在多次加载时 >= 100?我只需要它发生一次!


解决方案代码:

if (funPost.score >= global.hotNumber && funPost.hot == false) {
            var hotPostRef = firebase.database().ref("hot/section/"+key);
            var hotPost = {
                title: funPost.title,
                image: funPost.image,
                id: funPost.id,
                key: funPost.key
            }
            hotPostRef.set(hotPost);
            funPostRef.update({"hot": true});
        }
   else if (funPost.score <= (global.hotNumber - 25) && funPost.hot == true) {
        var hotPostRef = firebase.database().ref("hot/section/"+key);
        hotPostRef.remove();
        funPostRef.update({"hot": false});
   }

解决方案:我最终使用了一个布尔标志。

【问题讨论】:

  • 当您读取数据时,您似乎正在构建&gt;= 100 索引。是否有一个原因?写数据的时候有没有考虑过建索引?你不能有理由吗?这样做相对简单。
  • 如果您向包含分数的节点添加观察者,它会在更新时通知您的应用。因此,当它通知您的应用程序时,检查它是否为 100,如果是,则下载节点,分数为 0 并执行复制。如果这是一次性交易,您可以简单地让您的应用程序检查一个包含节点 /should_observe: true 的首选项节点,如果为真,则仅观察分数节点,如果为假,则不要添加观察者。但是,下载整个节点并将其写回似乎有点矫枉过正。你为什么这样做?
  • @Jay 如果您查看我的 res.render(),您会看到我正在传递整个帖子以在下一页显示信息。但一切都很好:我最终使用了一个布尔标志。今晚将发布我的代码。
  • @cartant 我想过。但是我写数据的那一刻是在客户端生成的。我更喜欢隐藏算法以在我的服务器代码的顶部获取帖子。因此我为什么要检查负载:)

标签: javascript node.js firebase firebase-realtime-database


【解决方案1】:

尝试使用.once() insted of .on()

    ref.once('value')
       .then(function(dataSnapshot) {
       // handle read data.
     });

【讨论】:

  • 这正是我已经想到的。但还是会在每次页面加载时触发。
  • 在服务器端,当页面加载时,帖子的分数也是如此。如果分数 >= 100,则将帖子设置为新位置。通常我会使用一个布尔标志来确保这只发生一次,但我不知道我会把它放在这里:/
  • 如果分数在刷新时失去其价值,您必须将其保存在数据库中并从那里显示,尤其是在服务器端。
  • 这与我的问题有什么关系?此外,这已经是我的网站的编码方式了。
  • 应该有一个解决方法,但是在我看到一些源代码之前很难弄清楚。我对 socket.io 有了一些想法
【解决方案2】:

我最终使用了一个布尔标志:

if (funPost.score >= global.hotNumber && funPost.hot == false) {
            var hotPostRef = firebase.database().ref("hot/section/"+key);
            var hotPost = {
                title: funPost.title,
                image: funPost.image,
                id: funPost.id,
                key: funPost.key
            }
            hotPostRef.set(hotPost);
            funPostRef.update({"hot": true});
        }
   else if (funPost.score <= (global.hotNumber - 25) && funPost.hot == true) {
        var hotPostRef = firebase.database().ref("hot/section/"+key);
        hotPostRef.remove();
        funPostRef.update({"hot": false});
   }

【讨论】:

    【解决方案3】:

    https://gist.github.com/katowulf/6099042 是您如何将 ref 复制或移动到另一个 ref。

    如何防止每次发布帖子时都上传节点 加载,因为它的分数在多次加载时 >= 100 ?我需要它 只发生一次!

    1) 如果路径键已经存在() 在新位置,则使用螺栓规则使写入失败。

    2) 是什么导致分数上升?例如调查完成,考试完成 这些事件应该发送到可以运行一系列管道以更新您需要的任何内容的 firebase 队列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      相关资源
      最近更新 更多