javascript - 当我首次创建用户进行身份验证时,如何将用户及其唯一 ID 添加到我的 Firebase 数据库中

标签 javascript firebase firebase-realtime-database firebase-authentication

这似乎是一个显而易见的问题,但我在 Firebase 数据库内创建用户时遇到问题。我对 firebase 和编码非常陌生。

我的理解是,当用户单击注册按钮时,将在“对象/用户”下创建具有新验证的 uid 的用户。但是该用户始终为空。在 google documentation 中说有时用户为空,因为它尚未完成初始化用户。并将其放入 onAuthStateChanged 中。但是,如果我这样做,每次用户都会被创建/覆盖登录或注销。

我想我正在寻找的是一些解决方案,当用户首次使用有效信息注册时,在我的 firebase 数据库中创建用户。

这是我的代码:

  function LoginCtrl($scope) {
    $scope.txtEmail = document.getElementById('txtEmail');
    $scope.txtPassword = document.getElementById('txtPassword');
    $scope.btnLogin = document.getElementById('btnLogin');
    $scope.btnSignUp = document.getElementById('btnSignUp');
    $scope.btnLogout = document.getElementById('btnLogout');


    btnLogin.addEventListener('click', e => {
        const email = txtEmail.value;
        const pass = txtPassword.value;
        const auth = firebase.auth();

        const promise = auth.signInWithEmailAndPassword(email, pass);
        promise.catch(e => console.log(e.message));

    });

    btnSignUp.addEventListener('click', e => {
        const email = txtEmail.value;
        const pass = txtPassword.value;
        const auth = firebase.auth();
        const promise = auth.createUserWithEmailAndPassword(email, pass);
        promise.catch(e => console.log(e.message));

        createUser();
    });

    function createUser() {
        var user = firebase.auth().currentUser;

        if (user != null) {
            const dbRefObject = firebase.database().ref().child('object');
            const dbRefList = dbRefObject.child("users/" + user.uid);
            dbRefList.set({
                name: "jim",
            });
        } 
    }

    btnLogout.addEventListener('click', e => {
        firebase.auth().signOut();
    });

    firebase.auth().onAuthStateChanged(firebaseUser => {
        if (firebaseUser) {
            console.log(firebaseUser);
            btnLogout.classList.remove('hide');
            btnLogin.classList.add('hide');
        } else {
            console.log('not logged in');
            btnLogout.classList.add('hide');
            btnLogin.classList.remove('hide');
        }
    })
}

最佳答案

罪魁祸首在于这三行:

const promise = auth.createUserWithEmailAndPassword(email, pass);
promise.catch(e => console.log(e.message));
createUser();

您过早地触发createUser()。在上面的代码片段中,这种情况发生在启动(异步)注册过程之后 - SDK 从未有机会在身份验证数据库中实际创建用户!

createUserWithEmailAndPassword 返回一个 promise ,如您的本地变量所示。这里您需要做的是链接两个调用,即履行 promise 后启动数据库操作。

试试这个:

// inside the click handler
btnSignUp.addEventListener('click', e => {
    const email = txtEmail.value;
    const pass = txtPassword.value;
    const auth = firebase.auth();

    auth.createUserWithEmailAndPassword(email, pass)
        .then(user => createUser(user)) // <-- important!
        .catch(e => console.log(e.message));
});

function createUser(user) {
    // no need for currentUser if you pass it in as an argument
    if (user) {
        ...
    }
}

关于javascript - 当我首次创建用户进行身份验证时,如何将用户及其唯一 ID 添加到我的 Firebase 数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40455909/

相关文章:

java - FirebaseUI - 不兼容的类型 : String cannot be converted to DatabaseReference

javascript - Firebase - 在表单提交上存储图像。 react JS

javascript - 如何从两个表中获取firebase的所有子数据

javascript - `style` Prop 需要从样式属性到值的映射,而不是字符串

javascript - 如何将包含对象字符串的数组转换为常规键对象对?

firebase - 如何将 Firebase 再次连接到移动用户界面?

ios - 带有 Firebase 版本 3 的 APNS

ios - firebase - 获取成员的所有聊天室

javascript - Meteor Blaze 按子文档属性排序子文档

javascript - 如何以同步方式制作Promise API?