2017-09-01 84 views
0

我可以在登錄後獲取令牌的值,因爲我正在傳遞函數的用戶名和密碼的值。在下一頁中,我沒有傳遞這些值。這對我爲什麼變得空無用有道理。那麼獲取該值的最有效方法是通過頁面之間傳遞用戶名和密碼並調用該函數?標記返回值的值爲空,未獲取標記的值。 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是等價的。只寫一個就足夠了;人們通常只寫this.accessToken == null以保持簡短。

+0

進行調整時出現此錯誤 - 錯誤TypeError:無法讀取未定義的屬性「長度」。還必須更改getToken():任何{} << ----- – userlkjsflkdsvm

+0

只需從答案中複製/粘貼片段就不會讓您的代碼神奇地工作。試着理解你的問題,並在你的其他代碼中應用相同的技術,可能會出現類似的錯誤。 '.length'甚至不出現在上面的代碼中。 –

+0

感謝幫助!我收到ERROR TypeError:無法讀取未定義的屬性'then',令牌未定義,因爲用戶未輸入憑據。我該如何去做,以便只有當用戶輸入他們的憑證時才調用這個函數。 – userlkjsflkdsvm