Angular2 route de la garde de retour Observables<bool>, comment gérer les erreurs

J'ai un itinéraire garde comme ci-dessous

@Injectable()
export class AuthGuard implements CanActivate {

constructor(private router: Router, private authenticationSvc: AuthenticationService) { }

canActivate(): Observable<boolean> {
    return this.authenticationSvc.getAuthenticatedUser().map(
        r => {
            if (this.authenticationSvc.isAuthenticated()) {
                //logged in so return true
                return true;
            }
            this.router.navigateByUrl('/login');
            return false;
        })
}

Le problème est que, parfois, getAuthenticatedUser renvoie un 401, et j'ai un http-intercepteur qui gère l'autoroute 401 et de rediriger vers la page de connexion. Le problème est que cette .la carte n'a jamais résolu parce que la requête http renvoie une erreur, et l'angle de routeur est coincé sur cette première demande de routage et ne peut pas gérer la demande subséquente de l'intercepteur. Comment puis-je gérer cette erreur et ont Observables retourné résoudre à faux et de garder les choses en mouvement?

  getAuthenticatedUser() {
         let getUserObservable = this.http.get(ApiUrl + 'security/getAuthenticatedUser')
            .map((res: any) => res.json())
            .share()

        //Get the result for the cache
        getUserObservable.subscribe(
            r => {
                if (r.success) {
                    this.authenticatedUser = r.result.user;
                }
            }); 

        //return the observable
        return getUserObservable;
  } 

et http intercepter ci-dessous

export class HttpInterceptor extends Http {
authSvc: AuthenticationService;
lastClicked: any = 0;
constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private _router: Router, private injector: Injector) {
super(backend, defaultOptions);
}
request(url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
return this.intercept(super.request(url, options));
}
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return this.intercept(super.get(url, options));
}
post(url: string, body: string, options?: RequestOptionsArgs): Observable<Response> {
return this.intercept(super.post(url, body, this.getRequestOptionArgs(options)));
}
put(url: string, body: string, options?: RequestOptionsArgs): Observable<Response> {
return this.intercept(super.put(url, body, this.getRequestOptionArgs(options)));
}
delete(url: string, options?: RequestOptionsArgs): Observable<Response> {
return this.intercept(super.delete(url, options));
}
getRequestOptionArgs(options?: RequestOptionsArgs): RequestOptionsArgs {
if (options == null) {
options = new RequestOptions();
}
if (options.headers == null) {
options.headers = new Headers();
}
options.headers.append('Content-Type', 'application/json');
return options;
}
intercept(observable: Observable<Response>): Observable<Response> {
return observable.catch((err, source) => {
//If we get a 401 from the api that means out FormsAuthenticationTicket has expired, clear the auth cookie and navigate back to terms page
if (err.status == 401) {
this._router.navigateByUrl('/login');
}
return Observable.throw(err);
});
}
  • Ne devriez-vous pas alors/attraper la réponse de getAuthenticatedUser? stackoverflow.com/questions/23559341/...
  • montrez-moi ce que tu veux dire, a ajouté http intercepter et getAuthenticatedUser() pour la référence
InformationsquelleAutor Josh | 2017-03-01