React 与 react-redux-firebase isLoaded 是 true 而 isEmpty 看似是 false,但 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 的 React 应用程序,我认为我已成功实施以跟踪用户会话。

我的 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 为真,我会假设用户和所有 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有时为null(这源于navigator.setGeoLocation(this.props.firebase);传入的参数)。如果我再次尝试登录,那么它会起作用。我找不到任何一致的复制方式。

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

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

currentUser will be null with the user is not signed in. It will also be null when a page first loads, before the user's token has been loaded and a User object is available. You should use an auth state observer获取User对象如果想在页面加载后异步加载后立即执行

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?