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

Я работаю над функцией регистрации приложений с использованием Firebase Authentication & Firestore. На данный момент, когда я создаю пользователя, я хочу также создать файл в моем Firestore. Однако моя функция onAuthStateChanged() просто пропускает эту операцию.

firebase.auth().onAuthStateChanged(function(user) {
       
    //User is signed in.
    if (user) {

        console.info("This happened.");

        //Create the Users document in the Firestore Database.
        firestore.collection("Users").doc(email).set({
            UserEmail: email,
            UserRole: role
        }).then(function() {
            console.info("Document successfully written!");
        }).catch(function(error) {
            console.error("Error writing document: " + error);
        });

        console.info("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.info("The value of role is not an accepted value: " + role + ".");

    }

});

Запустив это в браузере, я вижу оба сообщения «Это произошло». и «Так тоже было». консольные выходные данные и не получают никаких других консольных выходных данных или ошибок. Он также завершает перенаправления в нижней части оператора if. У меня было много проблем с этой функцией в этом файле, а также в других, поэтому любая помощь будет очень признательна! Спасибо!

Как вы показываете сейчас, электронная почта не назначается. Тем не менее, рассмотрите возможность использования UID пользователя в качестве идентификатора документа вместо электронной почты. Также подумайте, действительно ли изменяемая страница останавливает выполнение javascript на ней, так что операция Firestore никогда не завершается.

Doug Stevenson 04.03.2019 03:45

переместите код в ветку .then(); иначе вы бы победили идею обещаний и асинхронной операции...

Martin Zeitler 04.03.2019 03:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
123
1

Ответы 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.info("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.info("The value of role is not an accepted value: " + role + ".");
            else console.info("The value of role is not an accepted value: " + role + ".");
        }).catch(function(error) {
            console.error("Error writing document: " + error);
        });    
    }

});

Другие вопросы по теме