繁体   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