node.js-如何获取子节点已更改且已添加了子节点的节点的父节点?

时间:2016-11-11 11:53:59

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

这是我的json文件:

{
    "ERyWg81WxrXUb0sjsu9hv9T7K0E3" : {
            "intents" : {
            "intentName" : "",
            "intentValue" : ""
          },
          "messages" : {
            "-KViVgc7ZG051eMXP0-5" : {
              "name" : "Ed",
              "text" : "Hello, I'm Ed, your personal assistant cum friend",
              "timestamp" : "1476880306"
            }
          }         
    },
    "Y9UNlizDSobddO8cdq7K4ChipYa2" : {
        "intents" : {
            "intentName" : "",
            "intentValue" : ""
          },
          "messages" : {
            "-KViVgc7ZG051eMXP0-5" : {
              "name" : "Ed",
              "text" : "Hello, I'm Ed, your personal assistant cum friend",
              "timestamp" : "1476880306"
            }
          } 
    }
}

此处,ERyWg81WxrXUb0sjsu9hv9T7K0E3Y9UNlizDSobddO8cdq7K4ChipYa2是用户ID,他们有两个孩子,intentsmessages,他们的孩子如上面的JSON结构所示。
现在,当用户发送消息时,该消息将添加到用户的messages子节点。此外,必须注意的是,还可以在数据库中添加或删除其他用户 因此,当添加消息时,如何知道已发送消息的用户的id。例如:当ERyWg81WxrXUb0sjsu9hv9T7K0E3用户消息和消息添加到ERyWg81WxrXUb0sjsu9hv9T7K0E3 messages子目录时,我应该ERyWg81WxrXUb0sjsu9hv9T7K0E3。我必须在服务器端使用firebase node.js sdk执行此操作。

作为参考,我的node.js服务器端代码用于获取新消息:

var db = firebase.database();
var ref = db.ref("/");
console.log("Listening ...\n");
var text, name, timeStamp;
var newPost = {};
ref.on("child_changed", function(snapshot){
    snapshot.child("messages").forEach(function(itemSnapshot) {
        text = itemSnapshot.child("text").val();
        name = itemSnapshot.child("name").val();
        timeStamp = itemSnapshot.child("timeStamp").val();
  });

1 个答案:

答案 0 :(得分:0)

使用admin(a.k.a。服务器)SDK和客户端SDK之间没有根本区别。事件监听器的行为完全相同。

您不会从子事件侦听器获取您要查找的信息,也不会从父级获取,也不会从哪个后代触发更改。

您需要更改数据库架构和/或订阅策略,以实现目标。至少,你应该:

  1. 为服务器可以简单观察的所有外发消息设置一个(每用户)节点。 child_added事件将意味着发送邮件。
  2. 在邮件本身中包含发件人,收件人信息 您可以使用安全规则来确保客户端不会伪造发件人的身份。通过一些创造力,您还可以确保用户只有在有权限的情况下才能发送其他消息。