Получение текущего пользователя после входа в Firebase

#javascript #node.js #reactjs #firebase #react-native

#javascript #node.js #reactjs #firebase #react-native

Вопрос:

Я хочу отправить электронное письмо с подтверждением после регистрации пользователя. Я написал этот код, но если я хочу получить текущего пользователя с firebase на react native, он всегда возвращает null. Как я могу это исправить?

Вот функция регистрации:

 firebase
.auth()
.createUserWithEmailAndPassword(email, password)
.then(navigation.navigate("WaitingRoom"))
.catch((err) => console.log(err));
 

А также функция проверки электронной почты в WaitingRoom :

 firebase.auth().onAuthStateChanged(function (user) {
    if (user) {
      user
        .sendEmailVerification()
        .then(() => {
          console.log(":)");
        })
        .catch((err) => {
          console.log(err);
        });
    } else {
      console.log(":(");
    }
  });
 

Я также пробовал firebase.auth().CurrentUser, но он тоже возвращает null.

Комментарии:

1. Что вы подразумеваете под «он всегда возвращает null»?? Означает ли это, что этого никогда не происходит, в onAuthStateChanged наблюдателе, который user не равен нулю (т. Е. Вы всегда видите результат console.log(":("); в журнале)?

2. Это происходит, но есть задержка, и иногда мне приходится перезагружать страницу. Я думаю, мне нужно дождаться ответа или чего-то в этом роде. Но я его не нашел. @RenaudTarnec

Ответ №1:

Из вашего комментария выше: «Это происходит, но есть задержка, и иногда мне приходится перезагружать страницу. Я думаю, мне нужно дождаться ответа или чего-то в этом роде «.

Да, как объяснено в документе, вам нужно дождаться завершения Auth инициализации объекта.

Вот почему вы должны:

  • Либо используйте onAuthStateChanged() observer и поместите желаемый код / бизнес-логику в if (user) {} блок, где вы уверены user , что это не null.
  • ИЛИ вручную проверьте, что firebase.auth().currentUser это не null так, прежде чем запускать код / бизнес-логику.

Конкретно, исходя из того, что я понимаю из вашего вопроса, вы можете / должны вызвать navigation.navigate("WaitingRoom") onAuthStateChanged() наблюдателя следующим образом:

 firebase.auth().onAuthStateChanged(function (user) {
    if (user) {
      user
        .sendEmailVerification()
        .then(() => {
          navigation.navigate("WaitingRoom");
        })
        .catch((err) => {
          console.log(err);
        });
    } else {
      console.log(":(");
    }
  });
 

Комментарии:

1. Но в моем коде есть что-то странное. Консоль печатает «:(» но проверка электронной почты отправляет мне ссылку для проверки моей электронной почты, а затем печатает «:)». Почему этот код делает это?

2. Это связано с тем, что при первом запуске onAuthStateChanged наблюдателя запускается пользователь null , затем, когда вся инициализация Auth объекта завершена, он запускается снова (поскольку состояние входа пользователя изменилось), а затем пользователя нет null .