Firebase onAuthStateChanged() пропускает код

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

});