作为我学习的一部分,我需要开发web-app(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);
谢谢大家。
答案 0 :(得分:1)
当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 = "";
})
}