簡體   English   中英

為什么Firebase signInWithEmailAndPassword不觸發onAuthChange?

[英]Why firebase signInWithEmailAndPassword doesn't trigger onAuthChange?

當用戶登錄時,我觸發了以下功能:

const auth = firebase.auth();

export const signIn = ( email, password ) => (
    auth.signInWithEmailAndPassword( email, password )
    .catch(e => e ? console.log(e) : console.log(auth.currentUser))
);

如果我輸入了不正確的詳細信息,則錯誤將記錄到控制台中,但是如果詳細信息正確,則什么也不會發生。

當我在devtools中檢查網絡數據時,請求將返回應有的所有數據,但是在應用程序內部, auth.currentUser是未定義的(登錄后也將進行檢查)。

而且因為不太令人驚訝,

export const getUser = () => (
    async dispatch => (
        auth.onAuthStateChanged(user => {
            const { uid } = user = {};
            console.log(user)
            if (uid) {
                console.log(uid)
                dispatch(
                    setUserId(
                        uid
                    )
                )
            } else {
                console.log("nologin")
            }
        })
    )
);

剛開始時,在應用程序加載時使用undefinednologin觸發。 在Firebase控制台內部,啟用了電子郵件和密碼身份驗證,並且用戶有效。 我知道它應該工作,因為我以相同的方式通過Firebase進行了許多身份驗證過程,因此,如果您遇到相同的問題並解決了問題,那么我無法提供更多信息,請告訴我。

是的,我認為這與Firebase設計的異步特性有關。 因此signInWithEmail ...可以工作,但是不會立即反映出currentUser對象的更改。 而是使用事件onAuthStateChanged執行與currentUser相關的任何代碼。 該過程將是:

  1. 注冊onAuthStateChanged事件,並在其中檢測到currentUser == null,此事件將始終在第一個定義中以null用戶被調用,因此通過在其中放入if可以檢測何時處理實際登錄。

  2. 添加signIn函數,但不要在此處使用currentuser在回調上執行任何操作,而是將相關代碼移動到onAuthStageChanged。

另外,不是100%確保必須將事件包裝在模塊中並導出,還是應該這樣做。 在做網絡應用程序時,每個頁面都應該是無狀態且獨立的,因此每個頁面都應該有自己的腳本代碼來檢查auth事件並做適當的事情。

我是那樣做的,到目前為止一直都在工作。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM