Angular2 CanActivate state.url infinite loop

439 views
Skip to first unread message

wowia...@gmail.com

unread,
Jan 21, 2017, 8:39:44 AM1/21/17
to Angular
**Redirection to state.url within subscription to observable in CanActivate causes infinite loop**   



    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean{
/* to store and redirect after login if user not logged in */
let target_url: string = state.url;
let adminSubj = new Subject<boolean>();

return this.verifyLoginForAdmin( target_url );

}

verifyLoginForAdmin( target_url: string ){

if( this.authService.isLoggedin() ){

let token_email = 
this.authService
.jwt_helper
.decodeToken( localStorage.getItem(this.authService.jwt_name ) ).email;

this.authService.isAdmin( token_email )
.subscribe({ 
next:  data => {
if( data ){
                        this.router.navigate( [ target_url ]);
return true;
}
else{
this.router.navigate( [ '/coding-blog' ]);
return false;
}
},
error: error => console.log("CanActivate Error-->", error),
complete: () => console.log("done");
})

}

this.authService.targetUrl = target_url;

this.router.navigate( [ '/coding-blog' ] );

return false;
}



**authService#isAdmin() is:**  

    isAdmin( email: string ): Observable<boolean>{

return this.getDbInfo
.getOneUserByEmail( email )
.map( res => res.json().data.admin );

    }




In another route protected by a different CanActivate implementation  
I have the same set up with the `target_url`  
and it never goes into a perpetual loop.  
 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {

let targetUrl: string = state.url;

return this.verifyLogin( targetUrl, route.params['name'] );
}

verifyLogin(target_url: string, target_user: string): boolean{

if( this.authService.isLoggedin() ){
let token_name = 
this.authService
.jwt_helper
.decodeToken( localStorage.getItem( this.authService.jwt_name ) )
.name;

if( token_name === target_user){
this.router.navigate([ target_url ]);
return true;
}
else{
this.router.navigate([ '/projects' ]);
return false;
}
}
this.authService.targetUrl = target_url;
this.router.navigate([ '/projects' ]);
return false;

}

    }

**It seems to be the subscription that is doing the  
black magic in this sense.**  

Obviously I am not understanding this part of this  
technology very well.  
I think I am lost within Rxjs and Angular2 .. somehow ...somewhere ....  

Help please.


Reply all
Reply to author
Forward
0 new messages