#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
.