首页 文章

在运行嵌套查询的嵌套对象上使用firebase Cloud 函数搜索数据时未指定的索引

提问于
浏览
1

我正在使用fire-base来检索用户节点的嵌套数据,并且在运行查询时我面临这个问题从fire-base数据库中获取数据 .

考虑在/ users / YJdwgRO08nOmC5HdEokr1NqcATx1 / follow / users中将“.indexOn”:“userId”添加到您的安全规则中,以获得更好的性能 .

Database Structure:

"users" : {
    "1vWvSXDQITMmKdUIY7SYoLA1MgU2" : {
      "userEmail" : "test2kawee@gmail.com",
      "userId" : "1vWvSXDQITMmKdUIY7SYoLA1MgU2",
      "userName" : "Malik Abdul Kawee",
      "userPhoneNumber" : "",
      "userProfileImage" : "https://pbs.twimg.com/profile_images/1018741325875867648/ZnKeUiOJ_400x400.jpg"
    },
    "YJdwgRO08nOmC5HdEokr1NqcATx1" : {
      "following" : {
        "1vWvSXDQITMmKdUIY7SYoLA1MgU2" : {
          "currentFollowingUserId" : "YJdwgRO08nOmC5HdEokr1NqcATx1",
          "userEmail" : "test2kawee@gmail.com",
          "userId" : "1vWvSXDQITMmKdUIY7SYoLA1MgU2",
          "userName" : "Malik Abdul Kawee",
          "userPhoneNumber" : "",
          "userProfileImage" : "https://pbs.twimg.com/profile_images/1018741325875867648/ZnKeUiOJ_400x400.jpg"
        }
      },
      "userEmail" : "test2atif@gmail.com",
      "userId" : "YJdwgRO08nOmC5HdEokr1NqcATx1",
      "userName" : "Atif AbbAsi",
      "userPassword" : "test123",
      "userPhoneNumber" : "",
      "userProfileImage" : "http://paperlief.com/images/enrique-iglesias-body-workout-wallpaper-4.jpg"
    }
  }

Database Rules:

"users": {
     ".indexOn":  ["userId","currentFollowingUserId",".value"],
       "$userId": {
         "following": {
        //"$userId": {
             ".indexOn":  ["userId","currentFollowingUserId",".value"]
        }
    //}
       } 
}

Function Query:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);


exports.sendFollowingNotifications = functions.database.ref('/users/{userId}/following/{followingId}')
       //.onWrite(event => {
         .onCreate((snap,context) => {  


        console.info("Child value is val() " ,snap);


        var childNodeValue=snap.val();

        var topic=childNodeValue.userId;

        //var ref = firebase.database().ref.child('users');

        //console.log("testing ref pathName : " ,snap.ref.parent.parent.parent.pathname);
    //  console.log("testing ref : " ,snap.ref.parent.parent.parent.path);

        //var ref = admin.database().ref("users");

        //.child('users')

        return snap.ref.parent.parent.parent.orderByChild("userId").equalTo(childNodeValue.currentFollowingUserId)

     // .on('child_changed').then(snapshot => { once('value')
         .once('value', function(snapshot){ 
        var parentNodeValue=snapshot.val();

        console.info("Topic ID " ,topic);

        console.info("Parent value is val() " ,snapshot.val());

              var payload = {
            data: {
                username: parentNodeValue.userName,
                imageurl:parentNodeValue.userProfileImage,
                description:"Started Following You"
            }
        };



           // Send a message to devices subscribed to the provided topic.
        return admin.messaging().sendToTopic(topic, payload)
            .then(function (response) {
                // See the MessagingTopicResponse reference documentation for the
                // contents of response.
                console.log("Successfully sent message:", response);
                return response;
            })
            .catch(function (error) {
                console.log("Error sending message:", error);
                return error;
            });

      });








      });

return snap.ref.parent.child('users') . orderByChild(“userId”) . equalTo(childNodeValue.currentFollowingUserId)

我认为问题出在这个查询上,我对下一个节点的第一个查询是返回数据但是当我检索其父节点用户的数据时,我收到警告 .

我尝试使用 functions.database.ref ,但它给了我以下异常 .

so I tried using this `snap.ref.parent.`to get reference of parent node.

Firebase函数,admin.database() . ref(...)不是函数Firebase函数,functions.database() . ref(...)不是函数

1 回答

  • 1

    您正在阅读用户的错误参考 . 您需要执行以下操作才能获得正确的参考: snap.ref.parent.parent.parent (现在ref将在/ users) . 您的查询是尝试读取以下用户节点 .

    警告是您需要编写firebase规则,该规则启用基于userId的索引,否则操作将带宽昂贵 .

    这是添加索引的规则:

    "users": {
       "$uid" : {
         ".indexOn" : ["userId"]
       }
    }
    

    以下是有关数据库规则的更多信息的资源:https://firebase.google.com/docs/database/security/

    这是firebase轻松编写规则的简单工具:https://github.com/firebase/bolt

    P.S:你回来了两个承诺,你发送通知的最后承诺是行不通的 . 使用firebase查询嵌套或链接它 . 同时通过将 on('child_changed') 更改为 once('value') 来使您的查询单值事件 .

相关问题