我是js和firebase的新手。我正在尝试通过使用自己的名为用户的表将Firebase数据库用于自定义登录。我已经为每个循环使用了一个遍历数据。但是其他部分因此会多次执行。我需要打破循环,这样就不会发生。
这是我的数据:-
{"users" : [ {
"userId" : "1",
"username" : "admin",
"password" : "admin",
"type" : "admin"
}, {
"userId" : "2",
"username" : "cashier",
"password" : "cashier",
"type" : "cashier"
}]
}**
这是我写的代码:
var database=firebase.database();
function SignIn(){
var txtuser=document.getElementById('username').value;
var txtpass=document.getElementById('password').value;
var error=false;
firebase.database().ref('users').orderByKey().once('value').then(function(snapshot) {
snapshot.forEach(function(childSnapshot) {
var users = childSnapshot.child('username').val();
var pass=childSnapshot.child('password').val();
if(txtuser==users && txtpass==pass){
var type=childSnapshot.child('type').val();
if(type=="admin"){
location.href="admin.html";
}
else if(type=="cashier"){
location.href="cashier.html";
}
}
else{
error=true;
}
});
});
if(error==true)
{
window.alert("Invalid Credentials");
location.href="index.html";
}
}
答案 0 :(得分:1)
请使用Sign in a user with an email address and password流,而不要使用在数据库中存储身份验证详细信息的方法。
但是,由于您使用的是用户名而不是电子邮件,因此请将存储桶域附加到用户名(通常为PROJECT_ID.appspot.com
)上。
因此,您的"admin"
和"cashier"
用户将成为"admin@PROJECT_ID.appspot.com"
和"cashier@PROJECT_ID.appspot.com"
。为了进行电子邮件身份验证,即使没有收件箱,这些也是有效的电子邮件地址。
然后,您可以在整个Web应用程序中使用firebase.auth()来管理用户对“ admin.html”和“ cashier.html”等页面的访问控制。
注意:如果您曾经向用户发送过电子邮件,请确保省略与"*@PROJECT_ID.appspot.com"
匹配的电子邮件
警告:请勿以这种方式进行验证。请使用以上方法。
为回答问题,您可以使用以下代码:
var database=firebase.database();
function SignIn(){
var txtuser=document.getElementById('username').value;
var txtpass=document.getElementById('password').value;
firebase.database().ref('users').orderByChild('username').equalTo(txtuser).once('value')
.then(function(snapshot) {
if (!snapshot.hasChildren()) {
throw "username not found";
} else if (snapshot.numChildren() != 1) {
throw "duplicate usernames";
}
// only one child at this point, so only called once
snapshot.forEach(function(childSnapshot) {
if (pass != childSnapshot.child('password').val()) {
throw "password mismatch";
}
var type=childSnapshot.child('type').val();
if(type=="admin") {
location.href = "admin.html";
} else if(type=="cashier") {
location.href = "cashier.html";
} else {
throw "unknown user type";
}
})
})
.catch(function(error) { // catches any errors thrown by promises
location.href = "index.html";
});
}
在上面的代码中,每个throw
被Firebase查询返回的Promise
捕获。您可以阅读Promises here。
答案 1 :(得分:0)
只需检查error
内true
是否设置为.forEach
并使用return
来“突破”:
var database=firebase.database();
function SignIn(){
var txtuser=document.getElementById('username').value;
var txtpass=document.getElementById('password').value;
var error=false;
firebase.database().ref('users').orderByKey().once('value').then(function(snapshot) {
snapshot.forEach(function(childSnapshot) {
var users, pass;
if (error) { return; } // <-- "break" the "loop"
users = childSnapshot.child('username').val();
pass = childSnapshot.child('password').val();
if(txtuser == users && txtpass == pass){
var type=childSnapshot.child('type').val();
if(type == "admin"){
location.href="admin.html";
}
else if(type == "cashier"){
location.href="cashier.html";
}
} else {
error = true;
}
});
if(error) {
window.alert("Invalid Credentials");
location.href="index.html";
}
});
}