Firebase - 检测重复电子邮件错误的正确方法

时间:2016-12-02 12:21:48

标签: firebase firebase-realtime-database firebase-authentication

我正在尝试更新Firebase中当前登录用户的电子邮件详细信息,它运行正常,但我想知道是否有更好的方法来检测重复的电子邮件错误。

我想我有两个选择:

  1. 运行检查以查看用户输入的电子邮件是否已在Firebase中注册,如果没有,则继续执行插入功能。
    1. 尝试先插入电子邮件,然后在检测到电子邮件已存在时处理错误。
    2. 我认为第二种方法会更有效率,因为大多数用户不会输入重复的电子邮件,因此每次运行此检查似乎毫无意义。但是,在第二种方法中处理重复电子邮件检测的正确方法是什么?

      这是我目前的代码:

      function submitEmail(){
      
          var requesteduseremail = "myemail@email.com";
          var currentuser = firebase.auth().currentUser;
      
          currentuser.updateEmail(requesteduseremail).then(function() {
              console.log("Email should now be entered into the Firebase console.");
      
          }, function(error) {
      
              console.log("Something went wrong: "+error);
              if(error == "Error: The email address is already in use by another account."){
                  console.log("That email is already registered... so handle it here.");
              }
          });
      }
      

      此代码工作正常,我可以向用户显示一条消息,通知他们电子邮件已经注册。但由于我使用Firebase错误文本"Error: The email address is already in use by another account."来检测此错误,因此如果Firebase更改错误消息,它将会中断。是否可能使用我可以使用的数字错误代码? Firebase在未来不太容易被改变的东西?

      感谢您的帮助。

      更新

      目前检查电子邮件是否已存在的尝试:

      var useremail = testemail1@email.com;
      
          firebase.database().ref().child("active_emails").orderByChild("email").equalTo(useremail).once("value", function(snapshot) {
           var emailSnapshot = snapshot.val();
           if (emailSnapshot){
      
           console.log("Sorry, that email already exists");
      
           }else{
      
           console.log("Email doesn't already exist, can now run function to create the account.");
      
           }
      });
      

      即使我尝试使用已在Firebase应用中注册的电子邮件,也一直说电子邮件不存在。我想我可能会错误地引用数据。

      这是我的数据库的布局:

      MYAPP
      |_______chat
      |
      |_______users
      |       |_____userA
      |       |     |______email
      |       |     |______first_name
      |       |     |______last_name
      |       |
      |       |_____userB
      |
      |_______active_emails      
              |_______"email":"testemail1@email.com"
              |_______"email":"testemail2@email.com"  
      

      所以我正在尝试查看useremail

      中是否包含变量active_emails

      我认为错误在firebase.database().ref().child("active_emails").orderByChild("email").equalTo(useremail).once("value", function(snapshot){行,但我无法弄明白。

      对此的任何帮助都将非常感谢,再次感谢!

      更新2

      我目前的尝试:

                  firebase.database().ref('/active_emails/').equalTo(useremail).once("value", function(snapshot) {
                      var emailSnapshot = snapshot.val(); 
                      if(emailSnapshot){
                      console.log("Email exists.");
                      }else{
                      console.log("Email doesn't exist.");
                      }
      

1 个答案:

答案 0 :(得分:1)

在第一个选项中,首先检查是否存在电子邮件地址,然后插入新的电子邮件地址。这有一个竞争条件:

 User A                    User B                   Server
   |                         |
   + does a@b.com exist?--------------------------->
   |                         |
   |                         + does a@b.com exist?->
   |                         |
   +<- no ------------------------------------------
   |                         |
   |                         +<- no ----------------
   |                         |
   + create a@b.com ------------------------------->
   |                         |
   |                         + create a@b.com ----->
   |                         |

在这种情况下,您仍会收到第二个用户的错误消息,这是您的第二个选择。

这就是为什么你必须始终处理服务器端的情况并检查错误。如果您有时间,您还可以实施初始客户端检查,以提前警告您的用户重复。

例如,您可以在用户输入时实施此早期检查,并在检测到情况后立即显示“此电子邮件地址已在使用中”。但是,当用户提交其电子邮件地址时,您必须始终检查重复项,从而处理错误。

为了处理错误,您确实不应该依赖于消息字符串。返回的错误是JSON对象:

{
  code: "auth/email-already-in-use", 
  message: "The email address is already in use by another account."
}

所以你可以查看代码。请参阅reference documentation for updateEmail以获取可能的错误代码列表。