我想通过检查用户是否从服务器登录来保护我的路由,但异步函数不会被执行
这是我的代码:
canActivate (route: ActivatedRouteSnapshot , state: RouterStateSnapshot): Observable<any> {
let permission = route.data[ "permission" ]; //permissions are set on the routes
if(permission){
..execute another function which works
)
}else{
return this.checkLogin() //this one is the one that fails
}
}
功能上checkLogin
:
checkLogin (url?: string): any {
this.authService.checkLoggedin()
.subscribe(
res=>{
if(res){
return true;
}else{
this.router.navigate ( [ '/login' ] );
return false
}
}
)
}
现在在 auth 服务上
checkLoggedin():Observable<any> {
//check from server if user is loggdin
return this._httpclient.get(this.authurl + "/default/is-loggedin")
.map(res => {
return res.json().data;
},error=>{
return Observable.of(false);
}
);
}
我哪里可能出错了?
checkLogin
必须返回一个Observable<boolean>
or a Promise<boolean>
(或者一个简单的boolean
如果是同步的)。你没有返回任何东西。
尝试这个。代替subscribe
只需使用map
修改发出的值checkLoggedin()
然后返回Observable
与适当的布尔值。
checkLogin (url?: string): Observable<boolean> {
return this.authService.checkLoggedin()
.map(
res=>{
if(res){
return true;
}else{
this.router.navigate ( [ '/login' ] );
return false
}
});
}
一个好的提示也可能是永远不要将函数声明为返回any
,始终将其声明为您要返回的实际类型,然后编译器可以完成其工作,并在您实际需要返回结果时告诉您是否忘记返回结果。
同样地checkLoggedin():Observable<any>
应该checkLoggedin():Observable<boolean>
最大限度地提高捕获错误的机会(并且您可能需要对 json 数据进行一些转换才能使其正常工作)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)