当前位置: 首页 > 知识库问答 >
问题:

如何访问Firebase实时数据库中子节点的父节点?

郜卓君
2023-03-14

我的Firebase数据库映像在Firebase的实时数据库中,我正在尝试访问父节点的名称,并给出了子节点的名称。但是,.parent似乎需要对子节点的引用,如果没有父节点的名称,我似乎无法获得子节点的引用。

这是我的数据的代码:

<script src="https://www.gstatic.com/firebasejs/5.7.3/firebase.js"></script>
<script src="https://apis.google.com/js/platform.js" async defer></script>

<style>
    tr:hover {background-color: #f5f5f5;}
    th, td {
        border-bottom: 1px solid #ddd;
    }

</style>
<script>

    // Initialize Firebase
    // Check to see if you are logged in
    firebase.auth().onAuthStateChanged(function(user) {
        if (user == null) {
            alert("Not logged in.");
            return;
        } else {
            userId = user.uid;
            name = user.displayName;
            imageUrl = user.photoURL;
            email = user.email;
            var user = firebase.auth().currentUser;
            var newuser = user.getAdditionalUserInfo

            user.sendEmailVerification().then(function() {
            // Email sent.
            }).catch(function(error) {
            // An error happened.
            });
            if (firebase.auth().currentUser.emailVerified) {
                alert('Email Verified');
                console.log('Email Verified');
            }

            // write user data to users
            //writeUserData(userId, name, email, imageUrl);
            // moved to tweet function

            // write data to document
            mydiv = document.getElementById("mydata");
            mydiv.innerHTML = name
            myphotodiv = document.getElementById("myphoto");
            myphotodiv.innerHTML = "<img src='" + imageUrl + "'/>";

            firebase.database().ref('/tweets').once('value').then(function(snapshot) {
                var data = (snapshot.val());
                if (data == null) {
                  console.log("No data found at /tweets/" + userId);  
                } else {

                  firebase.database().ref('/users').once('value').then(function(snapshot) { 
                    var userdata = (snapshot.val());
                    if (userdata != null) {
                       dataarray = [data,userdata]
                       console.log(dataarray)
                       updatetweets(dataarray); 
                    }
                  });
                  //console.log(data)
                  //updatetweets(data);
                }
            });
        } // end user null check
    }); // end check auth state

    function encodeImageFileAsURL() {

        var filesSelected = document.getElementById("inputFileToLoad").files;
        if (filesSelected.length > 0) {
            var fileToLoad = filesSelected[0];
            var fileReader = new FileReader();
            fileReader.onload = function(fileLoadedEvent) {
                var srcData = fileLoadedEvent.target.result; // <--- data: base64
                //var newImage = document.createElement('img');
                //newImage.src = srcData;
                //document.getElementById("imgTest").innerHTML = newImage.outerHTML;
                document.getElementById("imgTest").innerHTML = srcData;
                //console.log("Converted Base64 version is: " + document.getElementById("imgTest").innerHTML);
                //console.log(srcData);
            }
            fileReader.readAsDataURL(fileToLoad);
        }
    } // end function

    // write user data
    function writeUserData(userId, name, email, imageUrl) {
        firebase.database().ref('users/' + userId).once('value',    function(snapshot) {
             if (!snapshot.exists()) {
                firebase.database().ref('users/' + userId).set({
                    username: name,
                    email: email,
                    profile_picture : imageUrl
                }); 
             }                                      
        });
    }


    function updatetweets(data) {
        var tweetnumber = 0;
        //var mylist = "<ul>";
        var mytab = "<table id='tweettable'>";
        users = data[1]; // put on top, because changed data - not good coding change later
        data = data[0];


        for (var u in data) {
            for (var t in data[u]) {
                mytab = mytab + "<tr>";
                var date = new Date(data[u][t].time);
                var time = date.toString();                    
                if (data[u][t].img != "") {
                    mytab = mytab + "<td><img src='" + users[u].profile_picture + "' width='50px'></td>";
                    mytab = mytab + "<td>" + users[u].email + "</td>";
                    mytab = mytab + "<td>" + data[u][t].tweet + "</td>";
                    mytab = mytab + "<td>" + time + "<br><img src='" + data[u][t].img + "' width='300px'></td>";
                    mytab = mytab + "<td><p>Like this tweet</p>" + "<button id=" + t + " onclick=" + "like(this.id)" + ">Like</button>" + "<p>Likes: </p>" + "<p id='" + t + "likes'" + "'>" + data[u][t].likes + "</p>" + "</td>";

                } else {
                    mytab = mytab + "<td><img src='" + users[u].profile_picture + "' width='50px'></td>";
                    mytab = mytab + "<td>" + users[u].email + "</td>";
                    mytab = mytab + "<td>" + data[u][t].tweet + "</td>";
                    mytab = mytab + "<td>" + time + "</td>";
                    mytab = mytab + "<td><p>Like this tweet</p>" + "<button id=" + t + " onclick=" + "like(this.id)" + ">Like</button>" + "<p>Likes: </p>" + "<p id='" + t + "likes'" + "'>" + data[u][t].likes + "</p>" + "</td>";
                } 
                mytab = mytab + "</tr>";
            }   
        }
        //mylist = mylist + "</ul>";
        mytab = mytab + "</table>"
        var mytdiv = document.getElementById("mytweets");
        //mytdiv.innerHTML = mylist;
        mytdiv.innerHTML = mytab;
    }

    // write tweets to firebase
    function tweet() {

        var twitdoc = document.getElementById("twit");
        var twitimg = document.getElementById("imgTest");
        var nameValue = twitdoc.value;
        var imgValue = twitimg.innerHTML;
        var d = new Date();
        var dayofweek = d.getDay();
        console.log(dayofweek);
        var weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
        var dayofmonth = d.getDate();
        var monthnumber = d.getMonth();
        var monthnames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
        var year = d.getFullYear();
        var thedate = weekdays[dayofweek] + ", " + monthnames[monthnumber] + " " + dayofmonth + ", " + year;
        console.log(thedate);
        var hours = d.getHours();
        var minutes = d.getMinutes();
        if (hours < 12) {
            var time = 
        }
        var js_time = Date.now();
        //var numberoffollowers = 2;
        var tweetid = firebase.database().ref('tweets/' + userId + "/").push({tweet: nameValue, time: js_time, date: thedate, img: imgValue, likes: 0});
        //var followers = firebase.database().ref('users/' + userId + "/").push({followers: numberoffollowers});
        twitdoc.value = "";
        writeUserData(userId, name, email, imageUrl);
        console.log("tweet written")

        firebase.database().ref('/tweets').once('value').then(function(snapshot) {
                var data = (snapshot.val());
                if (data == null) {
                  console.log("No data found at /tweets/" + userId);  
                } else { 
                    firebase.database().ref('/users').once('value').then(function(snapshot) { 
                    var userdata = (snapshot.val());
                    if (userdata != null) {
                       dataarray = [data,userdata]
                       console.log(dataarray)
                       updatetweets(dataarray); 
                    }
                  });
                }
            });



        // The unique key stored in tweetid is based on a timestamp, so list items will automatically be ordered chronologically. Because Firebase generates a unique key for each tweet, no write conflicts will occur if multiple users add a post at the same time. https://firebase.google.com/docs/database/admin/save-data

    }

    function like(t) {
        alert(t);
        console.log('tvalue' + t);
        console.log(t.ref());

        var y = firebase.database().ref('/tweets/' + userId + "/" + t);
        var parent = y.parent;
        console.log('Parent: ' + parent);
        var res = String(parent);
        console.log(res);
        var goal = res.substring((res.length - 28), res.length);
        console.log(goal);



        var oldlikes = document.getElementById(t + "likes").innerHTML;
        console.log(oldlikes);
        firebase.database().ref('/tweets/' + goal + "/" + t).once('value', function(snapshot) {
           console.log("/tweets/" + goal + "/" + t);
           console.log(snapshot.val());
           var oldlikenumber = snapshot.val().likes;
           console.log(oldlikenumber);
           var newlikes = oldlikenumber + 1;
                var tweetid = firebase.database().ref('tweets/' + goal + "/" + t).update({likes: newlikes});
                    console.log(newlikes);
            document.getElementById(t + "likes").innerHTML = newlikes;
                });


        /* console.log('liked tweetnumber' + tweetnumber);
        alert('liked tweetnumber' + tweetnumber);
        document.getElementById('tweetnumber' + tweetnumber).innerHTML = "Likes: " + 1;*/
    }

    //function follow {

    //}

    function signin() {
        console.log("Signing in");
        var provider = new firebase.auth.GoogleAuthProvider();
        firebase.auth().signInWithRedirect(provider).then(function(result) { 
            window.location.replace("fbtest.html");
        });
    }

    function signout() {
        console.log("Signing out");
        firebase.auth().signOut().then(function() {
        });
    }



</script>

<body>
    <button onclick="signin()">Sign in</button>
    <button onclick="signout()">Sign out</button>
    <br>
    <p>Step 1: delete your existing Firebase Realtime database</p>
    <a href="fbtest.json" target="_target">Step 2: replace JSON Firebase rules for database</a><br>

    <form>
        Tweet:<br>
        <textarea id="twit" type="text" name="thetweet" cols="100" rows="4"></textarea>
    </form> 
    <button type="button" onclick="tweet()">Submit</button>

    <br><input id="inputFileToLoad" type="file" onchange="encodeImageFileAsURL();" />
    <div id="imgTest" style="display:none;"></div>

<div id="mytweets"></div>
<div id="mydata"></div>
<div id="myphoto"></div>




</body>

问题出在like函数中:如果我能找到一种方法来获取发tweet(参数t表示的tweet)的人的userId,那么第一个var y和所有这些都是不必要的。

如果我可以得到那个人的userId(var whatever=我需要的userId),那么我可以写:

firebase.database().ref('/tweets/'+whatever+“/”+t).once('value',function(snapshot){

var tweetid=firebase.database().ref('tweets/'+whatever+“/”+t).update({likes:newlikes});

共有1个答案

衡玄裳
2023-03-14

虽然这个问题已经有一年了,可能是一个XY问题,但正如评论所说,我相信这可能会回答你的具体问题。如果您不知道直接父级,那么我知道的唯一的方法是通过查询检索到子级的子级,在这种情况下,您可以使用.ref.key从documentSnapshot中获取父级节点,如下所示:

database().ref("/users/").orderByChild("name").startAt(someText).once('value')
          .then(querySnapshot => {

               querySnapshot.forEach(docSnapshot => {

                   console.log("parent = " + docSnapshot.ref.key);

                   // if this docSnapshot was retrieved because of child "name"'s value
                   // at https://someapp-firebaseio.com/users/uid8234/name
                   // then docSnapshot.ref.key == uid8234

               })
          })

如果将用户数据存储在/users/中的uid节点下,例如将“name”作为每个uid节点的子节点之一,则可能会发生这种情况。当然,为了避免检索,您还可以将uid的一个额外副本存储在另一个键中,并与“name”和“reference”并列。

 类似资料:
  • 我想删除firebase实时数据库中某个子项的特定子项。 我已经添加了我的数据库的图片。 我想删除突出显示的子对象。

  • 由按键生成的firebase子节点 使用Javascript,如何在firebase实时数据库上删除由push key生成的子节点 上面的代码用于向实时数据库添加数据

  • 每当我使用Admin SDK从Node运行Firebase实时数据库代码时,进程都会挂起。例如,我可能有一个节点应用程序: 我使用运行。用户将设置为不活动,这很好。但是节点进程将挂起。我必须按ctrl-c才能返回提示。 我应该使用Firebase在节点应用程序中关闭连接或执行其他操作吗?对于Firebase函数,我必须返回从上述调用生成的promise。那么,Firebase函数是否自动处理关闭我

  • 我有两个关于Firebase实时数据库的重要问题(对于带有java的android)。 遵守以下结构: 我有以下课程: 为了搜索用户的数据(姓名、年龄、地区和肤色),我做到了: 问题1:在进行搜索时,firebase是只下载用户数据(除了消息节点)还是也下载消息节点中的数据? 想象一下,消息节点中有数百万条消息,进行此搜索,是否也会下载数百万条消息?为什么消息节点在用户节点内? 我只想要数据名称、

  • 如果子“contacts”的值为“9aIMkiMa0bSuMLjUk3R5bLpnoQS2”,我想从子“Group”中检索文本“Private Group”。我还想检查父子“问题帖子”的其他子节点是否具有相同的值。我一直在努力,但没有成功。这是我一直在使用的代码,但它只产生了错误。

  • 在实时数据库中未创建根节点。所有依赖项均已实施,firebase已连接到该项目。这是代码。 public void onComplete(@非空任务任务){