2017-06-22 70 views
2

我謹如果用戶從服務器登錄,但異步函數無法得到執行執行異步函數Angular2 authguards失敗

此檢查,以保護我的路線是我的代碼:

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 
     } 

    } 
) 
} 

現在的身份驗證服務

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); 
     } 
    ); 
} 

我在哪裏可能會出錯?

+0

您沒有從'checkLogin'返回結果。您需要將其更改爲返回'Observable '或'Promise '。 – Duncan

回答

3

checkLogin必須返回一個Observable<boolean>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數據,然後使其工作)。

+0

我看到了錯誤,因爲它現在可以工作 –

0

當導航成功時,this.router.navigate()解析爲true,因此實際上返回true。

https://angular.io/api/router/Router

你真正應該做的呼叫後您的canActivate方法checklogin的else塊router.navigate,並根據其結果。

0

試試這個方法:

public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) { 
     let permission = route.data[ "permission" ]; //permissions are set on the routes 
     return !permission ? true : this.checkLoggedin() 
        .map((res: any) => { 
         if (res) { 
          return true; 
         } 

         throw new Error('Not logged in!'); 
        }) 
        .catch(() => { 
         this.router.navigate(['/login']); 
         return Observable.of(false); 
        }); 
      }