2017-05-31 70 views
1

我試圖在getToken()檢索來自離子含量storage令牌,並且不是用它在refreshToken()看到如果令牌被傳遞到(this.jwtHelper.isTokenExpired(this.token)它返回一個真正的過期或取決於令牌是否過期。我已經把意見在refreshToken()那裏我得到了以下錯誤打字稿Angular2錯誤時,一個承諾,創造一個可觀察

錯誤1:

Error: TS2345:Argument of type '(response: Response) => void' is not assignable to parameter of type '(value: Response) => void'. Types of parameters 'response' and 'value' are incompatible. Type 'Response' is not assignable to type 'Response'. Two different types with this name exist, but they are unrelated. Property 'body' is missing in type 'Response'.

錯誤2:

Error:(34, 46) TS2339:Property 'token' does not exist on type 'Promise<any>'.

我的代碼

import {AuthHttp, JwtHelper, tokenNotExpired} from "angular2-jwt"; 
import {Observable} from "rxjs/Observable"; 
import {AuthService} from "../Services/Auth/auth.service"; 
import {Injectable} from "@angular/core"; 
import { Storage } from '@ionic/storage'; 
import {AlertController} from "ionic-angular"; 

@Injectable() 
export class TokenProvider { 

jwtHelper: JwtHelper = new JwtHelper(); 
token; 

constructor(private authHttp: AuthHttp, private storage: Storage, private alertCtrl: AlertController) { 
} 

getToken(): Promise<any> { 
    return this.storage.get('token').then(token => { 
    this.token = token; 
    }); 
} 

refreshToken(): Observable<any> { 

    return this.token = Observable.fromPromise(this.getToken()) 
    .flatMap(() => { 
     if(this.jwtHelper.isTokenExpired(this.token)) 
     { 
     return this.authHttp.get('localhost.api/refresh') 
      .subscribe( // ERROR 1 HERE 
      (response: Response) => { 
       this.token = response.json().token; // ERROR 2 HERE 
      }, 
      (error: Response) => { 
       console.log(error); 
      }); 
     } 
    }); 
} 
+0

您可以添加該文件的導入語句嗎? – Saravana

+0

用進口更新 – ghan

回答

3

您未在代碼中導入Response。編譯器可能弄糊塗了上Response使用,因爲有可能是你的分型多重定義:

import { Response } from '@angular/http'; 

而且,你不必返回觀察到的內部flatMap。您正在返回Subscription。返回像這樣的原始觀察值:

refreshToken(): Observable <any> { 

    let observable = Observable.fromPromise(this.getToken()) 
    .filter(() => this.jwtHelper.isTokenExpired(this.token)) 
    .flatMap(() => this.authHttp.get('localhost.api/refresh')); 
    observable.subscribe((response: Response) => { 
      this.token = response.json().token; 
     }, (error: Response) => { 
      console.log(error); 
     }); 
    return observable; 
} 
+0

這消除了響應錯誤(錯誤2),但現在我得到一行錯誤'.flatMap(()=> {'錯誤:(28,16)TS2345:類型'的參數)=>訂閱'不能分配給類型爲'(value:any,index:number)'的參數=> ObservableInput <{}>'。 類型'Subscription'不可分配給類型'ObservableInput <{}>'。 類型'Subscription'不是'ArrayLike <{}>'。 類型'Subscription'中缺少屬性'length'。' – ghan

+0

您必須返回'flatMap'內的observable。請參閱我的更新回答。 – Saravana

+0

錯誤消失了,但是當我運行它時我的瀏覽器現在我得到這個錯誤'TypeError:你提供'未定義'的地方在哪裏流提供一個Observable,Promise,Array或Iterable.' – ghan

0

該refreshToken功能是不正確

  • 你不能在RxJS訂閱內部運營
  • 獲取返回可觀察到的(或承諾,因爲它似乎在你的情況)

嘗試以下操作:

refreshToken(): Observable<any> {  
    return this.token = Observable.fromPromise(this.getToken()) 
    .flatMap(() => { 
     if(this.jwtHelper.isTokenExpired(this.token)) 
     { 
     return this.authHttp.get('localhost.api/refresh') 
     } 
    }) 
    .catch(() => console.log(error)) 
    .map(response: Response => response.json()) 
    .subscribe(value => { 
     this.token = value.token 
    }) 
}