javascript - 如何解决 Reactjs 和 Firebase Google Cloud Firestore 中发生的此错误?

标签 javascript reactjs firebase asynchronous google-cloud-firestore

我正在尝试从 Firebase Cloud Firestore 获取数据,并在加载到浏览器时将其加载到我的 Reactjs 应用程序中。但是,我收到以下错误。

错误信息

Unhandled Rejection (TypeError): Cannot read property 'then' of undefined

错误发生在以下行:

firebaseService.getUserData(authUser.uid).then(user => { ...

我得到初始页面加载,然后延迟大约两秒,然后弹出错误。所以我怀疑它来自于一些缺失的 promise 或回调没有被正确处理。我尝试在多个地方使用 async await 但没有成功。

如何解决此问题以正确获取和加载我的数据?

Auth.js
import firebaseService from 'firebaseService';
...
class Auth extends Component {
  ...
  firebaseCheck = () => {
    firebaseService.onAuthStateChanged(authUser => {
      if (authUser) {
        this.props.showMessage({ message: 'Logging in with Firebase' });
        // Retrieve user data from Firebase
        firebaseService.getUserData(authUser.uid).then(user => { // <-- error occurs here
          this.props.setUserDataFirebase(user, authUser);
          this.props.showMessage({ message: 'Logged in with Firebase' });
        })
      }
    });
  };
}
firebaseService.js
getUserData = userId => {
  if (!firebase.apps.length) {
    return;
  }
  const docRef = this.firestore.doc('users/myuserid');
  docRef.get().then(doc => {
    if (doc.exists) {
      console.log("Document data:", doc.data());
      return doc.data;
    } else {
      console.log("No such document!");
    }
  }).catch(error => {
    console.log("Error getting document:", error);
  });
};

最佳答案

当调用getUserData函数时,需要在函数结束之前返回一个Promise。当您调用docRef.get时,我假设这是一个异步调用,因此当发生这种情况时,函数结束并返回undefined。当它返回 doc.data 时,已经太晚了。

getUserData = userId =>
  new Promise((resolve, reject) => {
    if (!firebase.apps.length) {
      reject();
    }
    docRef.get().then(doc => {
      if (doc.exists) {
        console.log("Document data:", doc.data());
        resolve(doc.data);
      } else {
        console.log("No such document!");
        reject();
      }
    }).catch(error => {
      console.log("Error getting document:", error);
      reject();
    });
  });

关于javascript - 如何解决 Reactjs 和 Firebase Google Cloud Firestore 中发生的此错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52919019/

相关文章:

javascript - Jquery tmpl 创建一个或语句

arrays - 用形状 react proptype 数组

javascript - 什么是纯 reducer ?

swift - 从 Firebase 将字符串转换为 double 值

firebase - 安装 "firebase_firestore"Flutter插件后Cocoapods报错

javascript - Angular ui-router 嵌套路由在带有 babel 的 ES6 中不起作用?

javascript - 在for()循环中创建多个Smoothie.js图表

javascript - 总结nodejs上http返回的最好方法

web-applications - Flux 实现分析

swift - 是否可以将喜欢(从用户 A 到用户 B)限制为每天或 session 一次?