Javascript 角度+;Firebase-组件在页面刷新时未保持身份验证状态

Javascript 角度+;Firebase-组件在页面刷新时未保持身份验证状态,javascript,angular,firebase,firebase-authentication,Javascript,Angular,Firebase,Firebase Authentication,您好,我正在尝试使用Firebase为我的Angular应用程序构建简单的身份验证服务。问题是-用户可以登录/注册,我可以将他的凭据保存在本地存储中。但是,当我刷新页面时,本地存储中的信息仍保留在那里,但我的组件显示的视图应该是为未登录的用户提供的(因此我的身份验证状态等于已注销)。如果我不刷新页面,一切都会正常工作。这是我的身份验证服务(Auth.Service.ts): 从'@angular/core'导入{Injectable}; 从'@angular/fire/auth'导入{Angu

您好,我正在尝试使用Firebase为我的Angular应用程序构建简单的身份验证服务。问题是-用户可以登录/注册,我可以将他的凭据保存在本地存储中。但是,当我刷新页面时,本地存储中的信息仍保留在那里,但我的组件显示的视图应该是为未登录的用户提供的(因此我的身份验证状态等于已注销)。如果我不刷新页面,一切都会正常工作。这是我的身份验证服务(Auth.Service.ts):

从'@angular/core'导入{Injectable};
从'@angular/fire/auth'导入{AngularFireAuth};
从“rxjs”导入{BehaviorSubject};
从'@angular/Router'导入{Router};
界面用户{
名称:字符串;
电子邮件:字符串;
}
@注射的({
providedIn:'根'
})
导出类身份验证服务{
signedin$=新行为主体(false)
用户数据
构造函数(公共firebaseAuth:AngularFireAuth,专用路由器:路由器){
this.firebaseAuth.authState.subscribe((用户)=>{
如果(用户){
this.userData=user;
setItem('user',JSON.stringify(this.userData));
parse(localStorage.getItem('user'));
}否则{
setItem('user',null);
parse(localStorage.getItem('user'));
}
})
}
注册(电子邮件:string,密码:string){
这是firebaseAuth
.createUserWithEmailAndPassword(电子邮件,密码)
.然后(值=>{
this.router.navigate(['auth/login'])
log('Success!',value);
})
.catch(错误=>{
console.log('出现问题:',err.message);
});
}
登录(电子邮件:字符串,密码:字符串){
返回此文件。firebaseAuth
.使用电子邮件和密码登录(电子邮件、密码)
。然后((结果)=>{
this.signedin$.next(true)
log('Nice,it worked!',result);
返回结果
})
.catch(错误=>{
console.log('出现问题:',err.message);
});
}
注销(){
返回此.firebaseAuth.signOut()。然后(()=>{
this.signedin$.next(false)
localStorage.removietem('user');
这个.router.navigate(['movies']);
})
}

}
谢谢你以如此简洁的方式提出这个问题

代码中的问题是,当您刷新时,您定义的行为主题将不会保存其状态,因为服务类也将从头开始

您必须检查本地存储,以了解用户是否登录,因为只有loggedIn用户信息才会出现

在auth.service中创建一个方法

isUserSignedIn(){
if(localstorage.getItem('user')){ return true;
}
else return false;
}
现在在组件
this.authService.isUserSignedIn()中

另外,如果希望整个用户信息从函数返回,而不是布尔值true/false

return localstorage.getItem('user')