【问题标题】:Using Firebase, how can I create a query based on UID?使用 Firebase,如何创建基于 UID 的查询?
【发布时间】:2017-09-24 14:45:01
【问题描述】:

我创建了一个函数,可以将 UID 和项目状态一起添加到数据库中:

changestate(item) {

    var postData = {
      state: "listed",
    };

    var user = firebase.auth().currentUser;
    var uid = user.uid;

    var updates = {};
    updates['foods' + '/' + item.$key + '/' + 'state' + '/' + uid] = postData;

    return firebase.database().ref().update(updates);
  }

我想创建一个只显示与该 UID 对应的数据的查询。在我之前使用的查询中:

getLists(): FirebaseListObservable<any> {
return this.db.list('/foods', {
  query: {
    orderByChild: 'state',
    equalTo: 'listed'
  }
});}

这是我的数据库的结构:

{
  "foods" : {
    "foodID1" : {
      "category" : "Produce",
      "foodname" : "Apples",
      "state" : {
        "aePQkvozV6gehP7ihjN0OWCltKu2" : {
          "state" : "listed"
        }
      }
    },
    "foodID2" : {
      "category" : "Dairy",
      "foodname" : "Cheese",
      "state" : {
        "aePQkvozV6gehP7ihjN0OWCltKu2" : {
          "state" : "listed"
        }
      }
    }
  }
}

我需要做什么来显示与登录用户的 UID 对应的项目?

【问题讨论】:

    标签: javascript angular firebase firebase-realtime-database


    【解决方案1】:

    orderByChild 属性可以采用路径。于是代码就变得简单了:

    getLists(): FirebaseListObservable<any> {
      return this.db.list('/foods', {
        query: {
          orderByChild: 'state/'+firebase.auth().currentUser.uid+'/state',
          equalTo: 'listed'
        }
      });
    }
    

    这当然要求用户登录。要在没有登录用户的情况下测试查询,您可以使用硬编码值:

    getLists(): FirebaseListObservable<any> {
      return this.db.list('/foods', {
        query: {
          orderByChild: 'state/aePQkvozV6gehP7ihjN0OWCltKu2/state',
          equalTo: 'listed'
        }
      });
    }
    

    【讨论】:

    • 使用这个给了我以下错误:Uncaught (in promise): TypeError: null is not an object (evalating '__WEBPACK_IMPORTED_MODULE_2_firebase_app__["auth"]().currentUser.uid')
    • 这是否与此处引用的查询有关:ngOnInit() { this.moviesSvc.getLists().subscribe(lists =&gt; {console.log(lists); this.lists = lists}) }
    • 听起来您的用户尚未登录,在这种情况下无法进行查询。我添加了一个带有硬编码 UID 的 sn-p,以便您可以测试查询。
    • 我能够确认用户已登录:getLists(): FirebaseListObservable&lt;any&gt; { firebase.auth().onAuthStateChanged(function(user) { if (user) {console.log("blah", user.uid) // User is signed in. var uid = user.uid; } else { // No user is signed in. } }); return this.db.list('/foods', { query: { orderByChild: 'state/'+ firebase.auth().currentUser.uid+'/state', equalTo: 'listed' } }); } 但是,我仍然遇到同样的错误。
    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 2017-05-15
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多