Мне нужен способ разорвать этот цикл или альтернативный способ сделать это - PullRequest
0 голосов
/ 16 апреля 2019

Я новичок в js и firebase.Я пытаюсь использовать базу данных Firebase для пользовательского входа в систему, используя мою собственную таблицу под названием users.Я использовал для каждого цикла, чтобы пройти через данные.Но часть else выполняется несколько раз из-за этого.Мне нужно разорвать петлю, чтобы этого не случилось.

Это мои данные: -

{"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";
}
}

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Проверка подлинности с помощью пароля

Вместо того, чтобы использовать ваш метод хранения данных проверки подлинности в базе данных, используйте Вход пользователя с адресом электронной почты и паролем flow.

Тем не менее, поскольку вы используете имена пользователей, а не электронную почту, добавьте свой домен хранилища к имени пользователя (которое обычно будет PROJECT_ID.appspot.com).

Таким образом, ваши "admin" и "cashier" пользователи станут "admin@PROJECT_ID.appspot.com" и"cashier@PROJECT_ID.appspot.com".Ради аутентификации электронной почты это действительные адреса электронной почты, даже если они не имеют почтовых ящиков.

Затем вы можете использовать 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 перехватывается Promise возвращено запросом Firebase.Вы можете прочитать о Обещаниях здесь .

0 голосов
/ 16 апреля 2019

Просто проверьте, установлен ли 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";
    }
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...