2016-12-21 104 views
2

我創建了一個authguard來防止沒有登錄的用戶進入一個頁面。 authguard運行並返回true後,它不會重定向到相應的頁面。難道我做錯了什麼?Angular2 Authguard重定向路由不工作

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(
       private authStatusService: AuthStatusService, 
       private authService: AuthService, 
       private router: Router) { } 

    canActivate(): any { 

     return this.authStatusService.authStatus.subscribe(i => { 
      if(i === 'auth-login-success') { 
       return Observable.fromPromise(this.authService.getUser()) 
        .subscribe(res => { 
         if(!res.id) { 
          this.router.navigate(['summary']); 
          return Observable.of(false); 
         } 
         return Observable.of(true); 
        }, 
        error => { 
         return Observable.of(false); 
        }) 
      } else { 
       console.log('user has not logged in') 
       this.router.navigate(['login']); 
       return Observable.of(false); 
      } 
     }) 
    } 
} 

回答

1

類似的東西應該工作:

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(
       private authStatusService: AuthStatusService, 
       private authService: AuthService, 
       private router: Router) { } 

    canActivate(): any { 

     return this.authStatusService.authStatus 
     .mergeMap(i => { 
      if(i === 'auth-login-success') { 
       return this.authService.getUser()) 
        .map(res => { 
         if(!res.id) { 
          this.router.navigate(['summary']); 
          false; 
         } 
         return true; 
        }) 
        .catch(error => { 
         return false; 
        }) 
      } else { 
       console.log('user has not logged in') 
       this.router.navigate(['login']); 
       return false; 
      } 
     }) 
     .first() // not sure if this line is still necessary 
    } 
} 

路由器需要一個booleanPromise<boolean>Observable<boolean>。 當您撥打subscribe()時,您將收到一個不起作用的Subscription。 隨着map()返回Observable

+0

非常感謝幫助@GünterZöchbauer。這很有意義。 .first()不需要,並且工作得很好。但是,我收到了使用mergeMap()的打字錯誤。我嘗試了使用Google搜索,但無法找到解決方案。 '類型'(i:any)=> boolean |的參數Observable '不可分配給類型爲'(value:any,index:number)=> ObservableInput '的參數。 輸入'boolean | Observable '不可分配爲鍵入'ObservableInput '。 類型'true'不能分配給類型'ObservableInput '。 – PBandJen

+0

我剛剛看到 - 在catch()中它應該返回'Öbservable.of(false)'而不是'false'。我害怕我不知道 - 除了強打之外,我並沒有使用TS。 –