2017-09-01 6 views
0

私はログイン後にトークンの値を得ることができます。なぜなら、関数からユーザー名とパスワードの値を渡しているからです。次のページで、私はそれらの値を渡すつもりはありません。なぜ私がヌルになっているのかはわかります。その値を取得する最も効率的な方法は、ユーザー名とパスワードをページからページに渡し、その関数を呼び出すことです。トークンの値はNullを返し、トークンの値は取得しません。 Angular 4.3 Ionic 2+

Auth.ts

login(userName: string, password: string, route: string = null): any { 
    this.logout(false); 

    this.doLogin(userName, password) 
     .subscribe(response => { 
     let token:string = JSON.stringify(response.access_token); 
     this.storage.set('token', token); 
     console.log(token, 'this is the token here') 

     }); 
    } 

getToken(){ 
    this.storage.get('token').then((val) => { 
     this.accessToken = val; 
     }) 


     if(this.accessToken == undefined || this.accessToken == null){ 
       return '0' 
     } 
      else{ 
       return "Bearer " + this.accessToken.replace(/["]+/g, '') 
      } 
} 

component.ts

login(){ 
this.authService.login(this.account.username, this.account.password) 
} 

Interceptor.ts

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 


     let access = this.auth.getToken() 

     const authReq = req.clone({ 
       setHeaders: { 
       Authorization: access 
       } 
     }); 

    return next.handle(authReq) 
    } 

ありがとう!

答えて

0

コードはです。非同期です。

this.storage.get('token').then((val) => { 
    this.accessToken = val; 
}) 

if(this.accessToken == undefined || this.accessToken == null){ 
    return '0' 
} else { 
    return "Bearer " + this.accessToken.replace(/["]+/g, '') 
} 

ここで最初に起こることは、トークンが完了したら(最初のブロック)、何か起こることを望むことを登録することです。

次に、if/elseステートメントを実行します。 this.accessTokenはここでは常に定義されていません。

一度トークンをフェッチすると、thenコールバック内のコードが実行され、それ以降はaccessTokenに設定されます。

ここでいくつかのconsole.logを配置すると、この動作を確認できます。


このように、promiseコールバック内で非同期的にフェッチされたトークンに応じてコードを配置する必要があります。サイドノートとして

this.storage.get('token').then((val) => { 
    this.accessToken = val; 

    if(this.accessToken == undefined || this.accessToken == null){ 
    return '0' 
    } else { 
    return "Bearer " + this.accessToken.replace(/["]+/g, '') 
    } 
}) 

this.accessToken == undefinedthis.accessToken == nullは等価です。それらのうちの1つだけを書くだけで十分です。人々は通常それを短く保つためにthis.accessToken == nullだけを書く。

+0

調整中にこのエラーが発生しました。 - エラーTypeError:未定義のプロパティ 'length'を読み取ることができません。また、getToken()を変更する必要がありました:any {} << ----- – userlkjsflkdsvm

+0

スニペットを答えからコピー/貼り付けても、あなたのコードは魔法のように動作しません。あなたが持っていた問題を理解し、残りのコードで同じテクニックを適用すると、同様のエラーが発生する可能性があります。 '.length'は上記のコードにも現れません。 –

+0

ヘルプをよろしく!私はエラーを取得しています。TypeError:未定義の 'then'プロパティを読み取ることができません。ユーザーは資格情報を入力していないため、トークンは未定義です。ユーザーが資格情報を入力したときにのみこの関数が呼び出されるようにするにはどうすればよいでしょうか。 – userlkjsflkdsvm

関連する問題