2017-04-04 13 views
0

トークンを検証し、真偽の応答を返す単純なAuthGuardを作成しました。 APIサーバ(Express)とAuthサービスは正常に動作しますが、ユーザが何時でもログインにリダイレクトされるため、if (this.isValid())にバグがあります。認証ガードが動作しないのはなぜですか? Angular

export class AuthGuard implements CanActivate { 

    constructor(private router: Router, 
       private _authService: AuthService) { } 

    canActivate() { 
    if (this.isValid()) { 
     return true; 
    } else { 
     // not logged in so redirect to login page 
     this.router.navigate(['/login']); 
     return false; 
    } 

    } 
    isValid(): boolean { 
    let isValid = false; 
    if (localStorage.getItem('currentUser')) { 
     this._authService.verifyToken().subscribe(validToken => { 
     isValid = validToken === true; 
     }); 
    } 
    console.log(isValid); 
    return isValid; 
    } 
} 

ここで私のisValidはこの問題を引き起こしていますか?

+0

:上

isValid(): any{ let isValid = false; if (localStorage.getItem('currentUser')) { this._authService.verifyToken().subscribe(validToken => { isValid = validToken === true; console.log(isValid); return isValid; }); } } 

詳細情報? 'IsValid'関数をデバッグしましたか?認証サービスは機能していますか? 'console.log(isValid);は何を表示しますか? –

+0

コンソールログでisValidがtrueを示しています。私はエラーがなく、私の認証サービスが動作しています – Moshe

答えて

1

this._authService.verifyToken()は非同期操作なので、いつもをisValidから受信することになります。非同期操作subscribeコールバックは、データがAPIポイントから到着したときに実行されます。したがって、サブスクライブコールバックの前に

console.log(isValid); 
return isValid; 

が実行されます。

あなたは購読内部のロジックを移動することができます:あなたは、コンソールに記録されたエラーを取得することはありませんHow do I return the response from an Observable/http/async call in angular2?

+0

次のエラーが表示されます: 'TS2355:タイプが宣言された型が 'void'でないか 'any'が型を返さなければならない ' – Moshe

+0

@Moshe答えを更新しました。 'isValid()'の戻り値の型はこの時点で 'any'でなければなりません – echonax

関連する問題