javascript - 无法与firebase的实时数据库正确同步

标签 javascript authentication firebase firebase-realtime-database

作为我学习的一部分,我需要开发网络应用程序(javasript 语言),我们在其中使用 firebase 实时数据库。

当前在数据库中,我有一个用户对象树,代表注册到系统的所有用户。而我想做的是一个简单的用户登录功能。

用户输入用户名和密码后,我创建了一个数组来从数据库输入整个用户树。问题是,当我从 Firebase 调用该函数时,它还不足以结束。发生的情况是数组保持为空,并且您无法验证用户是否已在系统上注册。 现在我使用了一个临时解决方案,我使用setTimeout函数,我知道这是错误的编程,而且我不希望用户每次登录系统时都等待2秒。

有人可以帮我吗?没有 setTimeout 函数如何正确执行? 我希望 Firebase 的功能结束,然后才开始身份验证过程。

这是我到目前为止编写的代码,

        var correntUser;
        var userlist = []; 
        var usersRef = database.ref('users');

        // Query that inserts all users keys and names to an array.

        usersRef.orderByChild("username").on("child_added", function(snapshot) 
        { 
            userlist.push({userKey:snapshot.key,username:snapshot.val().username,password:snapshot.val().password});
        });

        setTimeout(function() 
        {
            //check if user exist in userlist.
            for(var i=0; i<userlist.length;i++)         
                if (userlist[i].username == usernameArg && userlist[i].password == passwordArg)
                    correntUser = userlist[i].userKey;

            if(correntUser == undefined)            
            {
                //check if  undefined
                alert("wrong username or password");
                document.getElementById("username").value = "";
                document.getElementById("password").value = "";
                return;
            }
            mainPage.addHeader();
        },2000);

谢谢大家。

最佳答案

当 Firebase 提供 built-in authentication 时,无需手动检查所有用户并查看是否与尝试的登录凭据匹配。 。基于密码的帐户需要电子邮件地址,尽管您可以将用户名与任何域名组合起来以满足该要求 as suggested here .

您没有解释 users 路径下的数据库结构是什么样的,但处理该问题的一种方法是合并 user's unique id作为 createUserWithEmailAndPassword 密码的一部分返回:

function createAccount(email, password) {
    firebase.auth().createUserWithEmailAndPassword(email, password)
    .then(function(userData) {
        // account created successfully
        usersRef.child(userData.uid).set({
            email: email,
            creation_date: new Date(),
            ...
        })
    }
    .catch(function(error) {
        ...
    })
}

然后登录尝试:

function login(email, password) {
    firebase.auth().signInWithEmailAndPassword(email, password)
    .then(function(userData) {
        // login successful
        mainPage.addHeader();
    })
    .catch(function(error) {
        alert("wrong username or password");
        document.getElementById("username").value = "";
        document.getElementById("password").value = "";
    })
}

关于javascript - 无法与firebase的实时数据库正确同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43889494/

相关文章:

javascript - 播放/暂停视频 onclick firefox

javascript - 是否可以仅使用 CSS 和单元格的 td 值动态地为 html 表格分配边框?

authentication - express-jwt与jsonwebtoken

javascript - JavaScript 中的 .clientWidth/.width 不适用于 img 标签

javascript - 过渡未正确执行

php - 如何重定向到需要特定证书才能访问的 https

authentication - 在这种情况下我应该如何使用 Google API?

ios - FireBase - 维护/保证数据一致性

java - 无法调用跟踪代码管理器的android JAVA

android - 收到消息后,Android 上的 Firebase Messaging 突然开始崩溃