在vuex中设置firebase.User会导致永恒循环

时间:2019-03-18 19:28:00

标签: typescript firebase vue.js vuex callstack

更新:仅在启用vuex严格模式时才会发生此错误

我正在使用Firebase身份验证构建Vue应用程序,但该应用程序失败并显示以下错误消息:

  

[Vue警告]:监视程序的回调发生错误“ function(){return this._data。$$ state}”:“错误:[vuex]不要在变异处理程序之外变异vuex存储状态。”

     

错误:[vuex]请勿在变异处理程序之外对vuex存储状态进行变异。

     

未捕获的RangeError:超出了最大调用堆栈大小

当我将用户提交到main.ts文件中的Vuex存储时,会发生错误:

firebase.auth().onAuthStateChanged(user => {
  if (user) {
    store.commit(constants.auth.SET_USER, user) // THIS LINE
    store.commit(constants.auth.SET_AUTHENTICATED, true)
    router.push('/')
  } else {
    store.commit(constants.auth.SET_USER, null)
    store.commit(constants.auth.SET_AUTHENTICATED, false)
    router.push('/signup')
  }
  if (!app) {
    app = new Vue({
      router,
      store,
      render: (h) => h(App),
    }).$mount('#app')
  }
})

这是我的突变:

[constants.auth.SET_USER](state: AuthState, payload: firebase.User): void {
      state.user = payload
}

我可以从Vue devtools看出,实际上确实发生了这种突变,并且用户已委托给商店,但是我不知道为什么会发生此错误。你能帮我吗?

我尝试注释掉应用程序中几乎所有其他内容,而这是唯一会引起麻烦的部分。

2 个答案:

答案 0 :(得分:1)

user.toJSON()存储在您的状态。 firebase用户是一个复杂的对象,不应以vuex状态存储。

答案 1 :(得分:0)

我认为您可能需要将firebase.auth().onAuthStateChanged包裹在new Promise中。

看这个例子:https://forum.vuejs.org/t/vue-routes-firebase-auth-sync-problem/4470#post2