Перед переходом на новую страницу проверьте, существует ли идентификатор аутентификации пользователя в базе данных firebase. - PullRequest
1 голос
/ 08 мая 2020

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

var sbmit = document.getElementById("submit");
sbmit.onclick = function (e) {
  var email = document.getElementById("email").value;
  var password = document.getElementById("password").value;
  var s = document.getElementById("school");
  var school = s.options[s.selectedIndex].value;
  e.preventDefault();

  if (school == null || school == "") {
    alert("Please select your school")
    return false;
  } else if (email == null || email == "") {
    alert('email can\'t be empty')
    return false;
  } else if (password == null || password == "") {
    alert("Password ca\'t be empty")
    return false;
  } else {
    toggleSignIn();
//After signing in, use the user auth id to check if the user exist in the selected school
    firebase.auth().onAuthStateChanged(user => {
      if (user) {
        ref = database.ref('/schools/')
        userId = firebase.auth().currentUser.uid;

        ref.child(school).orderByChild("AuthID").equalTo(userId).once("value", snapshot => {

          if (snapshot.exists()) {
            document.location.href = "/Result"
          } else {
            alert("You have selected the wrong school")
          }

        });

      }
    });
  }


}

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Очень необычно иметь слушателя onAuthStateChanged в подобном обработчике кликов. Скорее всего, вам нужно что-то вроде:

    ...
  } else {
    toggleSignIn();
    ref = database.ref('/schools/')
    userId = firebase.auth().currentUser.uid;

    ref.child(school).orderByChild("AuthID").equalTo(userId).once("value", snapshot => {

      if (snapshot.exists()) {
        document.location.href = "/Result"
      } else {
        alert("You have selected the wrong school")
      }
    });
  }

Кстати: если вы можете найти школу для пользователя с помощью запроса, есть ли какая-то конкретная c причина, по которой вы просто не заполняете это заранее значение для них в виде?

0 голосов
/ 08 мая 2020

В вашем коде есть ошибка. onAuthStateChanged слушатель подключается каждый раз, когда нажимается кнопка. Это может добавить несколько слушателей и один и тот же код, запускаемый несколько раз после каждого повторного щелчка. onAuthStateChanged слушатель должен быть прикреплен только один раз при загрузке документа. Ваш код должен выглядеть примерно так:

var sbmit = document.getElementById("submit");

sbmit.onclick = function (e) {
  var email = document.getElementById("email").value;
  var password = document.getElementById("password").value;
  var s = document.getElementById("school");
  var school = s.options[s.selectedIndex].value;
  e.preventDefault();

  if (school == null || school == "") {
    alert("Please select your school")
    return false;
  } else if (email == null || email == "") {
    alert('email can\'t be empty')
    return false;
  } else if (password == null || password == "") {
    alert("Password ca\'t be empty")
    return false;
  } else {
    toggleSignIn();
  }
}

document.onload = function () {
  firebase.auth().onAuthStateChanged(user => {
    if (user) {
      ref = database.ref('/schools/')
      userId = firebase.auth().currentUser.uid;

      ref.child(school).orderByChild("AuthID").equalTo(userId).once("value", snapshot => {

        if (snapshot.exists()) {
          document.location.href = "/Result"
        } else {
          alert("You have selected the wrong school")
        }

      });

    }
  });
}

Я предполагаю, что функция toggleSignIn() используется для входа в систему и изменит Firebase AuthState при успешном входе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...