首页 > 解决方案 > 在创建用户时将数据写入 Firestore 不起作用

问题描述

我正在使用 VueCLI 和 Firebase(Auth 和 Firestore)。

本质上,该函数被正确调用并在数据库中正确注册用户,但是,没有在 .createUserWithEmailAndPassword 函数上调用承诺(例如 .then 和 .catch)。

没有返回错误,也没有在 Firestore 中注册任何内容,这真的让我很难过。

但是,有时它会完全按预期工作??但经常不规律。

submit () {
  var v = this

  firebase.auth().createUserWithEmailAndPassword(v.form.email, v.form.password)
    .then(function () {
      // set account  doc
      var account = {
        email: v.form.email,
        name: v.form.name,
        picture: v.form.picture
      }
      db.collection('Users').doc(v.form.email).set(account).then(() => {
        console.log('Database Details Defined')
        // Set user display name
        v.$store.commit('setUserDisplayName', v.form.name)
        // Set user display name
        v.$store.commit('setUserImage', v.form.picture)
        // Set user as signed in
        v.$store.commit('changeLoginState', true)
        // Set user email
        v.$store.commit('setUserEmail', v.form.email)

        // console.log('Vue Store Details Defined')

        localStorage.setItem('name', v.$store.state.displayName)
        localStorage.setItem('email', v.$store.state.email)
        localStorage.setItem('userImage', v.$store.state.userImage)
        localStorage.setItem('loggedin', v.$store.state.isLoggedin)

        // console.log('Local Storage Details Defined')

        // Redirect user to dashboard
        v.$router.replace('/')
        v.registering = false
      }).catch((error) => {
        v.databaseError = 'Database Error: ' + error.code + ' - ' + error.message
        v.registering = false
      })
    })
    .catch(function (error) {
      v.registrationError = 'Registration Error: ' + error.code + ' - ' + error.message
      v.registering = false
    })
}

在此处输入图像描述

标签: javascriptfirebasevue.jsgoogle-cloud-firestorefirebase-authentication

解决方案


您有一个getDB()返回 Firestore 实例值的函数,因此getDB().collection("users")...可能已按预期工作。我看不到db这个特定文件中的初始化位置,因此console.log(db)可能有助于检查它的价值。

firebase.firestore().collection('Users').doc(v.form.email).set(account)

这按预期工作,因为firebase.firestore()肯定会返回 Firestore 实例。我建议直接导出 Firebase 服务,而不是在函数中。例如,您可以创建一个文件firebase.js并在那里初始化 Firebase:

var firebase = require('firebase/app')
require('firebase/firestore')

const firebaseConfig = { }

if (!firebase.apps.length) {
  firebase.initializeApp(config);
}

const auth = firebase.auth()
const db = firebase.firestore()

export {db, auth}

如图所示,您只需初始化一次 Firebase。它会比在getDB函数中初始化要清楚得多。


推荐阅读