#javascript #firebase #google-cloud-firestore
#javascript #firebase #google-облако-firestore
Вопрос:
Я работаю над функцией регистрации приложений с использованием аутентификации Firebase и Firestore. В данный момент, когда я создаю пользователя, я хочу также создать файл в моем Firestore. Однако моя onAuthStateChanged()
функция просто пропускает эту операцию.
firebase.auth().onAuthStateChanged(function(user) {
//User is signed in.
if (user) {
console.log("This happened.");
//Create the Users document in the Firestore Database.
firestore.collection("Users").doc(email).set({
UserEmail: email,
UserRole: role
}).then(function() {
console.log("Document successfully written!");
}).catch(function(error) {
console.error("Error writing document: " error);
});
console.log("This also happened.");
//Redirect user to the dashboard for their role.
if(role === "Customer") window.location.replace("customer.html");
else if (role === "Manager") window.location.replace("manager.html");
else if (role === "Deliverer") window.location.replace("deliverer.html");
else console.log("The value of role is not an accepted value: " role ".");
}
});
Запуская это в браузере, я вижу как «Это произошло», так и «Это также произошло». консольные выходные данные и не получаю никаких других консольных выходных данных или ошибок. Он также завершает перенаправление в нижней части инструкции if. У меня было много проблем с этой функцией в этом файле, а также с другими, поэтому я был бы признателен за любую помощь! Спасибо!
Комментарии:
1. Как вы сейчас показываете, электронная почта не назначается. Тем не менее, рассмотрите возможность использования UID пользователя в качестве идентификатора документа вместо электронной почты. Также подумайте, эффективно ли изменение страницы останавливает выполнение javascript на ней, чтобы операция Firestore никогда не завершалась.
2. переместите код в
.then()
ветку; иначе вы отвергнете идею обещаний и асинхронной работы …
Ответ №1:
Любой код, которому требуется состояние входа пользователя в систему, должен находиться внутри onAuthStateChanged
обратного вызова. Вы уже сделали это, так что вы на полпути к цели.
Любой код, который должен выполняться после успешной записи данных в базу данных, должен находиться внутри then()
обратного вызова. Итак:
firebase.auth().onAuthStateChanged(function(user) {
//User is signed in.
if (user) {
//Create the Users document in the Firestore Database.
firestore.collection("Users").doc(email).set({
UserEmail: email,
UserRole: role
}).then(function() {
console.log("Document successfully written!");
//Redirect user to the dashboard for their role.
if(role === "Customer") window.location.replace("customer.html");
else if (role === "Manager") window.location.replace("manager.html");
else if (role === "Deliverer") window.location.replace("deliverer.html");
else console.log("The value of role is not an accepted value: " role ".");
else console.log("The value of role is not an accepted value: " role ".");
}).catch(function(error) {
console.error("Error writing document: " error);
});
}
});