2016-12-02 162 views
0

我試圖更新Firebase中當前登錄的用戶的電子郵件詳細信息,該工具正常工作,但我想知道是否有更好的方式來檢測重複電郵錯誤。Firebase - 檢測重複電子郵件錯誤的正確方法

我想我有兩個選擇:

  1. 運行檢查,看是否用戶輸入在火力地堡已經註冊的電子郵件,如果沒有,則與功能的繼續插入。

  • 嘗試先插入電子郵件,然後,如果它檢測到該電子郵件已存在處理該錯誤。
  • 我認爲第二種方法會更有效率,因爲大多數用戶不會輸入重複的電子郵件,所以每次運行此檢查似乎毫無意義。但是,在第二種方法中處理重複電子郵件的檢測的正確方法是什麼?

    這是我當前的代碼:

    function submitEmail(){ 
    
        var requesteduseremail = "[email protected]"; 
        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未來將不太可能改變某些內容?

    謝謝你的幫助。

    UPDATE

    當前試圖檢查電子郵件已經存在:

    var useremail = [email protected]; 
    
        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":"[email protected]" 
         |_______"email":"[email protected]" 
    

    所以我想檢查,看看是否變種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

    在你的第一個選擇,你檢查的電子郵件地址的存在,然後再插入新的電子郵件地址。這有一個競爭條件:

    User A     User B     Server 
        |       | 
        + does [email protected] exist?---------------------------> 
        |       | 
        |       + does [email protected] exist?-> 
        |       | 
        +<- no ------------------------------------------ 
        |       | 
        |       +<- no ---------------- 
        |       | 
        + create [email protected] -------------------------------> 
        |       | 
        |       + create [email protected] -----> 
        |       | 
    

    在這充其量你仍然會得到第二個用戶,這是你的第二個選項的錯誤消息。

    這就是爲什麼你必須總是處理服務器端的情況,並檢查錯誤。如果您有時間,您也可以實施初始客戶端檢查,以提前將用戶提醒重複。

    例如,您可以在用戶輸入時執行此早期檢查,並在檢測到情況後立即顯示「此電子郵件地址已被使用」。但是,當用戶提交他們的電子郵件地址時,您必須始終檢查重複內容,從而處理錯誤。

    爲了處理錯誤,你的確不應該依賴於消息字符串。返回的錯誤是JSON對象:

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

    因此您可以檢查代碼。請參閱reference documentation for updateEmail以獲取可能的錯誤代碼列表。

    +0

    嗨@ frank-van-puffelen非常感謝你的回答!我現在要標記它是正確的,但是想知道是否可以在我的問題底部看看更新。我試圖檢查電子郵件是否已經存在,但我似乎無法正確,它一直說電子郵件不存在,我想我錯誤地引用了子節點?再次感謝你的幫助。 – Emily

    +0

    再次@ frank-van-puffelen我已經用我最近的一次嘗試檢查數據庫中是否存在電子郵件的方式更新了我的答案。它仍然無法工作,但我想知道,是否需要返回「active_emails」的全部內容,然後搜索電子郵件,或者是否可以在Firebase查詢中指定電子郵件,因爲我是試圖在上面?再次感謝您的幫助。 – Emily

    +0

    快速瀏覽一下代碼看起來正確。但僅僅用一小段片段就很難確定。如果你一直有問題,獲得幫助的最好方法是建立一個最小化的jsbin來重現問題。 –