如果我们的前端角度应用程序失去与后端服务器的连接,我试图将用户重定向回登录屏幕,但是有些东西被破坏了。
通过点击退出来从我的NavBarComponent触发正常注销:
ngOnInit() {
this.me = JSON.parse(localStorage.getItem('currentUser') || 'null');
}
logout() {
this._authenticationService.logout();
}
这又调用了身份验证服务注销函数():
logout() {
localStorage.removeItem('currentUser');
this._userService.announceLoginUpdate(false);
}
我的NavBarComponent正在订阅updateUserStatus $并将重定向到登录:
this.subscription = _userService.updateUserStatus$.subscribe( loggedIn => {
this.loggedIn = loggedIn;
if(this.loggedIn) {
console.log('NavbarComponent, 1');
this.me = JSON.parse(localStorage.getItem('currentUser') || 'null');
} else {
console.log('NavbarComponent, 2');
this.me = null;
//this._ref.markForCheck();
//this._ref.detectChanges();
this.router.navigate(['/login']);
}
});
这一切都有效,但我也希望前端能够检测到它是否已经失去与后端的连接(后端崩溃,重启等)。因此,如果前端从后端收到403,它将尝试向/ user / me执行新的后端请求,如果还返回403,它将重定向到登录屏幕。 (这是到目前为止的基本情景)
我创建了一个带有handleError函数的error.service,如果前端在与后端通信时收到错误,将会调用该函数:
handleError(error: any) {
this._authenticationService.isUserLoggedIn().subscribe(response=> {
console.log('isUserLoggedIn, User is logged in', response.statusCode);
}, error => {
console.log('isUserLoggedIn, User is not logged in', error.statusCode);
this._authenticationService.logout();
});
return Observable.throw("500 internal server error");
}
这不能正常工作。它正确捕获错误(从后端获取403),并调用this._authenticationService.logout(),然后删除用户并强制NavBarComponent订阅的更新,然后重定向到登录页面。
然而,登录页面呈现的登录组件没有文本,没有模型绑定,并且没有调用登录组件ngOnInit。 LoginComponent似乎没有"实例化"。
我的LoginComponent ngOnInit:
ngOnInit() {
console.log("LoginComponent ngOnInit");
this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';
}
执行普通用户注销时,将调用ngOnInit并且组件可以正常工作。
有谁知道出了什么问题?它是从不同的地方(一个来自组件,一个来自服务)执行的相同代码
我在执行普通用户注销时附加了登录页面的屏幕截图,并且来自"强制"服务注销。