首页 文章

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

提问于
浏览
0

这是交易 . 我正在使用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

    我提出了一个适用于我的案例的解决方案,可能对你有用 .

    我做的是在用户进行身份验证时附加值侦听器,然后在用户失去身份验证时将其关闭 . 使用此方法,我只是要求在用户实际进行身份验证时检索用户数据 . 我是这样做的:

    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)
      }
    })
    
  • 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.

相关问题