如何根据当前用户从Firebase检索

时间:2017-07-24 21:51:09

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

这是合约。 我正在使用VueFire,并希望从我设置的Firebase数据库中检索数据。在那里,我有一个用户节点,每个节点都由一个唯一的id定义。同样对于每个用户我都有一个装满购物车的购物车阵列。为了使它动态,我在firebase钩子中调用引用,如下所示:

export default {
  firebase:{
      cart: app.database().ref('users')
  }, //and so on and so on
}

而不是.ref('users')我想要检索当前用户,使用他的唯一ID,如:.ref('users/' + user.uid + '/cart') 为了获得当前用户的uid,我做了firebase.auth().onAuthStataChanged(user=>{//code here})的观察者 问题是,因为这是异步的,所以在检索当前用户之前激活firebase钩子。我试图简单地调用firebase.auth().currentUser,但这也很慢并且不可靠。 我愿意接受各种建议!

2 个答案:

答案 0 :(得分:0)

我制作了一个适用于我的案例的解决方案,可能为你的工作。

我做的是在用户进行身份验证时附加值侦听器,然后在用户失去身份验证时将其关闭。使用这种方法,如果用户实际经过身份验证,我只需要检索用户数据。以下是我的表现方式:

this.$root.firebase.auth().onAuthStateChanged(user => {
  if (user) {
    this.$store.dispatch('setUserUID', user.uid)
    // Listen for User Data
    let dataRef = this.$root.db.ref('/userdata/' + user.uid)
    let self = this
    dataRef.on('value', function(snap) {
        let value = snap.val()
        self.$store.dispatch('setUserData', value)
      })
  }
  else {
    // Stop Listening for User Data
    this.$root.db.ref('/userdata/' + this.$store.state.user.uid).off()
    this.$store.dispatch('setUserUID', null)
  }
})

答案 1 :(得分:0)

好的,我明白了。感谢@Daniel D关于绑定作为数组或对象的提示。因此事实证明我不必在firebase引用钩子中执行它,我只需要将它作为数组绑定在mounted()钩子中。我只是在数据中声明一个空cart: [],然后像这样填充它:

<script>
import changeColorMixin from '../mixins/changeColorMixin'
import animateFunction from '../mixins/animationMixin'
import Firebase from 'firebase'
import app from '../firebaseApp'

export default {
 data(){
   return{
     isLoggedIn: '',
     cart: []
   }
 },
 methods:{
    changeColor: changeColorMixin,
    animateEntrance: animateFunction,
    promptLogin: function(){
    console.log('you need to login!');
},
chooseSize: function($event){
    $($event.target).parents().eq(2).addClass('chosen');
},
closeOrder: function($event) {
    $($event.target).parents().eq(2).removeClass('chosen');
},
makeOrder: function($event){
    var $this = this;
    Firebase.auth().onAuthStateChanged(function(user){
        if(user){
            var cartRef = app.database().ref('users/' + user.uid + '/cart');
                var currentCart;
                cartRef.once('value', function(result) {
                    currentCart = result.val();
                    var size = $($event.target).html();
                    var name = $($event.target).parents().eq(2).attr('id');
                    app.database().ref('users/' + user.uid + '/cart/' + name + '/count').once('value', function(snap){
                        var count = snap.val();
                        if(count > 0){
                            count = count + 1;
                        }else{
                            count = 1;
                        }
                        cartRef.child(name).set({
                            size: size,
                            count: count,
                            name: name
                        });
                    });
                });
            }else{
                console.log('gotta login mate');
            }
        });
    }
},
mounted(){
Firebase.auth().onAuthStateChanged(user => {
  if(user){
    this.isLoggedIn = true;
        var cartRef = app.database().ref('users/' + user.uid + '/cart');
        this.$bindAsArray('cart', cartRef);
  }else{
    this.isLoggedIn = false;
  }
});
    this.animateEntrance();
    this.changeColor();
  }
}
</script>

我非常感谢@Daniel D