【问题标题】:Vuex and firebase: The user id is undefined in the firebase databaseVuex 和 firebase:用户 id 在 firebase 数据库中未定义
【发布时间】:2020-11-23 09:37:40
【问题描述】:

我正在创建一个电子商务网站。

现在我完成了使用电子邮件和密码创建新帐户。

我想在数据库中插入用户电子邮件、全名和时间戳。

如下图所示,我可以在 google chrome 开发控制台中看到 USER 数据。

但是当我在浏览器中检查 firebase 数据库时,我看不到用户 ID。相反,我在用户 ID 列中看到未定义。

现在我正在进行第 3 步流程。

  1. 将用户数据添加到数据库中

我不知道为什么会这样,所以我希望你能帮助我。

这是我的 store/index.js 文件。

import fireApp from '@/plugins/firebase'


export const state = () => ({
    
    user: null,
    error: null,
    busy: false,
    jobDone: false
})

export const mutations = {
   
    setUser (state, payload) {
        state.user = payload
    },
    setError (state, payload) {
        state.error = payload
    },
    clearError (state, payload) {
        state.error = null
    },
    setBusy (state, payload) {
        state.busy = payload
    },
    setJobDone (state, payload) {
        state.jobDone = payload
    },
}

export const actions = {
   
    signUpUser({commit}, payload) {
        commit('setBusy', true)
        commit('clearError')
        //1.Signup new user.
        //2.Update firebase user profile & set local user data.
        //3.Add user data into database
        //4.Attach user to consumer group
        let newUser = null
        fireApp.auth().createUserWithEmailAndPassword(payload.email, payload.password)
            .then(user => {
                newUser = user
                var user = fireApp.auth().currentUser;
                user.updateProfile({ displayName: payload.fullname })
                const currentUser = {
                    id: user.uid,
                    email: payload.email,
                    name: payload.fullname,
                    role: 'consumer'
                }
                console.log('USER', currentUser)
                commit('setUser', currentUser)
            })
            .then(() => {
                const userData = {
                    email: payload.email,
                    fullname: payload.fullname,
                    createdAt: new Date().toISOString()
                }
                
                fireApp.database().ref(`users/${newUser.uid}`).set(userData)
            })
            .then(() => {
                commit('setJobDone', true)
                commit('setBusy', false)
            })
            .catch(error => {
                commit('setBusy', false)
                commit('setError', error)
            })
    }
}

export const getters = {
    
    user (state) {
        return state.user
    },
    error (state) {
        return state.error
    },
    busy (state) {
        return state.busy
    },
    jobDone (state) {
        return state.jobDone
    }
}



  

【问题讨论】:

    标签: javascript firebase vue.js firebase-realtime-database firebase-authentication


    【解决方案1】:

    这是因为createUserWithEmailAndPassword() 方法返回的承诺使用UserCredential 对象而不是User 对象解析。

    您应该使用UserCredentialuser 属性,如下所示:

        let newUser = null
        fireApp.auth().createUserWithEmailAndPassword(payload.email, payload.password)
            .then(userCredential => {
                newUser = userCredential.user;
                //...
    

    另请注意,您无需致电fireApp.auth().currentUser 即可获取user

    当使用createUserWithEmailAndPassword() 方法时,在成功创建用户帐户后,该用户也将登录到您的应用程序,因此只需使用userCredential.user 获取用户,如上所述。


    此外,请注意,updateProfile() 方法是异步的并返回一个 Promise,您需要将其包含在您的 Promise 链中。

    所以以下应该可以解决问题(未经测试):

      signUpUser({commit}, payload) {
          commit('setBusy', true)
          commit('clearError')
          //1.Signup new user.
          //2.Update firebase user profile & set local user data.
          //3.Add user data into database
          //4.Attach user to consumer group
          let user = null;
          fireApp.auth().createUserWithEmailAndPassword(payload.email, payload.password)
              .then(userCredential => {
                  user = userCredential.user;
                  return user.updateProfile({ displayName: payload.fullname });
              })
              .then(() => {
                  const currentUser = {
                      id: user.uid,
                      email: payload.email,
                      name: payload.fullname,
                      role: 'consumer'
                  }
                  console.log('USER', currentUser)
                  commit('setUser', currentUser)
                  const userData = {
                      email: payload.email,
                      fullname: payload.fullname,
                      createdAt: new Date().toISOString()
                  }
    
                  return fireApp.database().ref(`users/${user.uid}`).set(userData)
              })
              .then(() => {
                  commit('setJobDone', true)
                  commit('setBusy', false)
              })
              .catch(error => {
                  commit('setBusy', false)
                  commit('setError', error)
              })
      }
    

    【讨论】:

    • 非常酷,谢谢,我能成功。但是我仍然必须继续调用 fireApp.auth().currentUser 因为,当我注册时出现错误“用户未定义。”。您的附加答案也有效!非常感谢。
    • “当我注册时”到底是什么意思?在createUserWithEmailAndPassword in your code 之后的所有then() 块中,应该定义用户(因为您没有注销)。如果您注销并重新登录,那么您确实需要使用fireApp.auth().currentUseronAuthStateChanged 来获取用户。
    猜你喜欢
    • 2020-01-12
    • 2020-08-08
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多