【问题标题】:firebase.auth().onAuthStateChanged getting null after refresh page in vuexfirebase.auth().onAuthStateChanged 在 vuex 中刷新页面后为空
【发布时间】:2020-07-19 04:29:40
【问题描述】:

我正在使用 Vuex 和 Firebase 身份验证。重新加载页面时卡住了。 firebase.auth().onAuthStateChanged 需要时间来响应。但我需要同时重新加载页面。我在互联网上看过很多教程,其中大部分是路由器保护,但我不想要。我有一些用户登录的路线,然后可以导航到该路线。

我正在申请的 App.vue。

created () {
    firebase.auth().onAuthStateChanged(async user =>{
        if (user){
          await this.$store.dispatch('autoSignIn',user)
        }
      })
  }

如果用户在重新加载页面之前登录,则这是我在重新加载页面时触发自动登录的 vuex 操作。

 autoSignIn ({commit}, payload) {
            commit('setUser',{email:payload.email, userId:payload.uid})

        }

这是我的吸气剂

 isAuthenticated:state => {
    return state.user !== null && state.user !== undefined ? state.user : null
 }

这里我称我的 getter isAuthenticated。

  getEventsByUser({getters,commit}){

            let data = [];

            firebase.database().ref('usuario/' + getters.isAuthenticated.userId + '/eventos/')
                .on("value", eventos =>{
                     eventos.forEach(evento =>{
                        data.push({"id":evento.key, ...evento.val()})
                    });
                    commit('setEventsByUser',data)
                })

        },

这是调度动作的组件

<template>
    <div>
        <div v-for="(event,id) in getEventsByUser" :key="id">
            {{event}}
        </div>
    </div>
</template>

<script>
    export default {
        name: "MyEvents",

        computed:{
            getEventsByUser(){
                return  this.$store.getters.getEventsByUser;
            },
        },
        mounted() {
            this.$store.dispatch('getEventsByUser')
        },



    }

这是我重新加载页面时的错误

【问题讨论】:

  • 据我所知,没有任何代码试图读取userId,但这就是错误消息的含义。您确定错误来自您共享的代码吗?堆栈跟踪似乎指向getEventsByUser
  • 嗨@Frank van Puffelen,我上传了使用isAuthenticated getter和使用userId的代码
  • 我从评论框中删除了代码。我坚持这一点,每当我刷新页面时,它都会给我这个错误。谢谢

标签: javascript vue.js firebase-authentication vuex


【解决方案1】:

当页面加载时,Firebase 会检查为用户存储的 ID 令牌是否仍然有效。这需要它调用服务器,因此可能需要一些时间。在此检查期间,用户将为 null,因此您的代码需要在任何地方处理它。

在您的 onAuthStateChanged 处理程序中,您可以正确处理:

firebase.auth().onAuthStateChanged(async user =>{
    if (user){

但是在getEventsByUser 中,您假设有一个用户,这(如错误消息所示)不正确。因此,在将侦听器附加到数据库之前,您需要在此处添加一个检查,以查看是否有用户:

getEventsByUser({getters,commit}){
    let data = [];
    if (getters.isAuthenticated) {
        firebase.database().ref('usuario/' + getters.isAuthenticated.userId + '/eventos/')
        ...

【讨论】:

  • 那我该怎么做呢?等到获取到用户,然后执行getEventUser中的代码。我真的卡在这里了。
  • 我用 else 语句实现了你说的条件。但我想获得用户价值。我该怎么做?
  • 如果没有登录用户,您还无法获取用户的数据。但是onAuthStateChanged 应该在 Firebase 检查/刷新令牌后不久触发,此时您可以加载他们的数据。
猜你喜欢
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 2020-02-15
  • 1970-01-01
相关资源
最近更新 更多