与 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()?