Как я могу устранить эту ошибку, возникающую в Reactjs и Firebase Google Cloud Firestore? - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь получить данные из Firebase Cloud Firestore и загрузить их в мое приложение Reactjs после загрузки в браузер.Тем не менее я получаю следующую ошибку.

сообщение об ошибке

Необработанное отклонение (TypeError): Не удается прочитать свойство 'then' из неопределенного

Ошибка возникает в следующей строке:

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

Я получаю начальную загрузку страницы с задержкой около двух секунд, а затем появляется ошибка.Поэтому я подозреваю, что это происходит из-за того, что какое-то пропущенное обещание или обратный вызов были обработаны неправильноЯ пытался использовать 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);
  });
};

1 Ответ

0 голосов
/ 21 октября 2018

Когда вы вызываете функцию 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();
    });
  });
...