【问题标题】:How can I solve this error occurring in Reactjs and Firebase Google Cloud Firestore?如何解决 Reactjs 和 Firebase Google Cloud Firestore 中发生的此错误?
【发布时间】:2019-03-25 22:03:25
【问题描述】:

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

错误信息

未处理的拒绝(TypeError):无法读取未定义的属性“then”

错误发生在以下行:

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

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

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

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);
  });
};

【问题讨论】:

    标签: javascript reactjs firebase asynchronous google-cloud-firestore


    【解决方案1】:

    调用getUserData函数时,需要在函数结束前返回一个Promise。当您调用docRef.get 时,我假设这是一个异步调用,因此在发生这种情况时,函数结束并返回undefined。当它到达return 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();
        });
      });
    

    【讨论】:

    • @Mowzer 您的编辑不正确。你不能在那里使用return,因为代码没有用大括号括起来。它应该按照原来的方式工作。不是吗?
    • 嘿,不错。我的实际代码确实将它全部括在花括号中。但我删除了它们,一切都按照你最初写的那样工作。再次感谢,最后的收获! ?
    猜你喜欢
    • 2022-06-25
    • 2018-09-25
    • 2019-08-30
    • 2021-10-29
    • 2020-06-18
    • 1970-01-01
    • 2020-09-12
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多