在浏览新页面之前,检查用户的auth id是否存在于firebase数据库中。

问题描述 投票:0回答:1

一个用户登录成功后,我想用用户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")
          }

        });

      }
    });
  }


}

javascript firebase-realtime-database firebase-authentication
1个回答
1
投票

很不正常的是,有一个 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")
      }
    });
  }

顺便说一句:如果你可以通过查询为用户查找学校, 有什么特殊的理由不简单地在表单中为他们预先填充这个值吗?


0
投票

你的代码有一个缺陷。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。

© www.soinside.com 2019 - 2024. All rights reserved.