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?
所以我可能很难解释我遇到的这个问题,我无法始终如一地重现这个问题。我有一个正在使用 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?