与 react-redux-firebase 反应 isLoaded 是真的, isEmpty 似乎是假的,但 firebase.auth().currentUser 是 null - 可能是啥原因?

Posted

技术标签:

【中文标题】与 react-redux-firebase 反应 isLoaded 是真的, isEmpty 似乎是假的,但 firebase.auth().currentUser 是 null - 可能是啥原因?【英文标题】:React with react-redux-firebase isLoaded is true and isEmpty is seemingly false, yet firebase.auth().currentUser is null - what could be the cause?与 react-redux-firebase 反应 isLoaded 是真的, isEmpty 似乎是假的,但 firebase.auth().currentUser 是 null - 可能是什么原因? 【发布时间】:2021-03-27 07:42:10 【问题描述】:

所以我可能很难解释我遇到的这个问题,我无法始终如一地重现。我有一个 React 应用程序,我在其上使用 react-redux-firebase,并且我认为我已成功实施以跟踪用户会话。

我的 App.js 文件有以下位或路由代码作为示例(使用 react-router-dom):

<Route
    path="/signin"
    render=() => 
        if (!isLoaded(this.props.auth)) 
            return null;
         else if (!isEmpty(this.props.auth)) 
            return <Redirect to="/posts" />;
        
        return <Signin />;
    
/>

这可以正常工作。我在用户未登录时转到Signin 组件,或者在用户登录时转到Posts。在Signin 组件中我有这样的逻辑发生:

        // sign the user in
        this.props.firebase.login(
            email: user.email,
            password: user.password
        ).then(response => 

            // detect the user's geolocation on login and save
            if (isLoaded(this.props.auth)) 
                const navigator = new Navigator();
                navigator.setGeoLocation(this.props.firebase);
            

            // redirect user to home or somewhere
            this.props.history.push('posts');
            
        )

我正在像这样导入 isLoaded:

import  firebaseConnect, isLoaded  from 'react-redux-firebase';

条件工作正常,用户登录,然后isLoaded 条件发生 - 这就是问题出现的地方。使用 isLoaded true 我会假设用户和所有 redux-firestore 用户属性都可以使用......但有时情况并非如此。在 navigator.setGeoLocation 调用中我有这个:

setGeoLocation(propsFirebase, cb) 
    if (navigator.geolocation) 
        navigator.geolocation.getCurrentPosition((position) => 
            propsFirebase.auth().currentUser
                .getIdToken(/* forceRefresh */ true)
                .then((idToken) => 
                    ...
                );
            
        )
    

此时,propsFirebase.auth().currentUser 有时为空(这源于navigator.setGeoLocation(this.props.firebase); 中传递的参数)。如果我再次尝试登录,那么它可以工作。我找不到任何一致的复制方式。

我在其他组件中也注意到了这一点。我不确定这是否是我的计算机进入睡眠状态时发生的问题,我应该重新启动整个 React 进程还是什么?有没有人见过类似的问题?如果是这样,在路由中检查用户状态时我可能会丢失什么?

如果需要更多代码,请告诉我...

【问题讨论】:

不是随机的吗?还是经常发生? 似乎是随机的......它发生了一次,然后就再也不会发生了。 【参考方案1】:

currentUser 将在用户未登录时为空。当页面首次加载时,在加载用户令牌且用户对象可用之前,它也将为空。如果您想在页面加载后异步加载后立即采取行动,您应该使用auth state observer 来获取用户对象。

firebase.auth().onAuthStateChanged((user) => 
  if (user) 
    // User is signed in, see docs for a list of available properties
    // https://firebase.google.com/docs/reference/js/firebase.User
    var uid = user.uid;
    // ...
   else 
    // User is signed out
    // ...
  
);

您可能还想阅读更多详细信息:Why is my currentUser == null in Firebase Auth?

【讨论】:

这太好了,好像这就是发生在我身上的事情 - 问题:如果(用户) - 用户与 firebase.auth().currentUser 是同一个对象吗?我可以假设如果设置了用户,那么 firebase.auth().currentUser 也将是? 如果你从观察者函数得到一个回调,你可以确定在回调完成后 currentUser 将是非空的。在回调内部,您应该使用提供的用户对象。

以上是关于与 react-redux-firebase 反应 isLoaded 是真的, isEmpty 似乎是假的,但 firebase.auth().currentUser 是 null - 可能是啥原因?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firestore 通过“react-redux-firebase”存储配置文件数据?

如何纠正 Redux 商店中的 React-Redux-Firebase 错误

使用 react-redux-firebase 消费云功能 - React JS

使用 React 和 react-redux-firebase 在登录期间确定范围

如何使用 react-redux-firebase 将 'auth' 或 'profile' 对象传递给 firestoreConnect()?

如何将 firestoreConnect 指向 React-Redux-Firebase 中的嵌套集合?