开发者问题收集

超出最大调用堆栈大小(在 Nuxt + Firebase 项目中)

2020-07-26
1462

我目前正在 Nuxt 和 Firebase 中创建身份验证功能。

登录和注销过程本身可以完成,并且标题显示也会相应更改,但是当我按下登录按钮时,控制台中出现错误。

错误内容(在控制台中)

Uncaught RangeError: Maximum call stack size exceeded
    at Function.keys (<anonymous>)

code

Header.vue(这是包含登录按钮的页面。)↓

googleLogin () {
      const provider = new firebase.auth.GoogleAuthProvider()
      auth.signInWithPopup(provider)
        .then(res => {
          this.dialogAuthVisible = false
          this.$store.dispatch('auth/setUser',res.user)
        }).catch(e => console.log(e))
 }

store/auth.js↓

export const strict = false

export const state = () => ({
  user: null
})

export const mutations = {
  SET_USER (state, payload) {
    state.user = payload
  }
}

export const actions = {
  setUser ({ commit }, user) {
    commit('SET_USER',user)
  }
}

export const getters = {
  isAuthenticated (state) {
    return !!state.user
  }
}

default.vue↓

mounted () {
    auth.onAuthStateChanged(user => {
      const { uid, displayName, photoURL} = user
      if (user) {
        this.$store.dispatch('auth/setUser', { uid, displayName, photoURL})
      } else {
        this.$store.dispatch('auth/setUser', null)
      }
    })
  }

如果我遗漏了任何信息,请告诉我🙇️。 请教我怎么做🙇️。

2个回答

我认为问题出在这行代码中:

export const mutations = {
  SET_USER (state, payload) {
    state.user = payload
  }
}

export const actions = {
  setUser ({ commit }, user) {
    commit('SET_USER',user)
  }
}

这些突变和动作之间存在循环

soroush
2020-07-26

我没有将整个有效负载设置到存储对象中,而是只选择了我需要的字段,这样就解决了我的问题。

之前:

  AUTH_STATUS_CHANGED ({commit}, data: any): any {
    if (data && data.authUser) {
      commit('SetAuthUser', data.authUser);
    } else {
      commit('SetAuthUser', null);
    }
  }

之后:

AUTH_STATUS_CHANGED ({commit}, data: any): any {
    if (data && data.authUser) {
      const user = data.authUser;
      commit('SetAuthUser', {
        uid: user.uid,
        email: user.email,
        emailVerified: user.emailVerified,
        displayName: user.displayName,
        isAnonymous: user.isAnonymous,
        photoURL: user.photoURL,
        stsTokenManager: user.stsTokenManager,
        createdAt: user.createdAt,
        lastLoginAt: user.lastLoginAt,
        apiKey: user.apiKey,
      });
    } else {
      commit('SetAuthUser', null);
    }
  }

在突变内部,只需添加从突变有效负载收到的值。

Isuru Liyanage
2022-10-01