2017-06-24 2 views
0

Ich habe Methode in einem gewissen Service:Angular 2 rxJs, abonnieren Fehler

public approveTokenExpiration(): Observable<any> { 
    let header = new Headers(); 
    header.append('Authorization', this.getTokenHeaderValue()); 
    let options = new RequestOptions({headers: header}); 
    return this.http.get(Constants.oauthLoginEndPointUrl, options) 
     .map(res => { 
     return res; 
     }) 
     .catch(err => { 
     return refreshToken() 
      .subscribe(res => { 
      return res; 
      }); 
     }); 
    } 

Aktualisierungs-Token-Methode:

public refreshToken(): Observable<any> { 
    let refreshToken = localStorage.getItem(Constants.REFRESH_TOKEN); 
    let refreshEndPointUrl = Constants.oauthLoginEndPointUrl + "?grant_type=refresh_token&client_id=" + 
     Constants.clientId + "&client_secret=" + Constants.clientSecret + "&refresh_token=" + refreshToken; 
    this.http 
     .post(refreshEndPointUrl, {}) 
     .map(res => { 
     this.setAuthLocalStorageItems(res); 
     this.removeAuthLocalStorageItems(); 
     return res; 
     }); 
    } 

Und Abonnement:

request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> { 
    this.customOptions = options; 
    return this.authService.approveTokenExpiration() 
     .subscribe(
     res => { 
      this.addAuthHeader(); 
      return super.request(url, this.customOptions); 
     }, 
     err => { 
      this.authService.refreshToken(); 
      this.addAuthHeader(); 
      return super.request(url, this.customOptions); 
     }); 
    } 

ich folgende Fehler bekommen :

ERROR in [at-loader] ./src/app/auth/intercept/auth.interceptor.ts:18:5 TS2322: Type 'Subscription' is not assignable to type 'Observable'. Property '_isScalar' is missing in type 'Subscription'.

Und überprüfen Sie bitte, ob alles in Ordnung ist mit meiner RxJs Handhabung;

Antwort

1

Es gibt ein paar Probleme mit Ihrem Code. Das spezifische Problem, das Sie erhöht wird, durch diesen Teil verursacht:

request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> { 
    this.customOptions = options; 
    return this.authService.approveTokenExpiration() 
     .subscribe(... // <- this will return a Subscription 

Beachten Sie, dass die request Funktion definieren Observable<Response> ein Ergebnis vom Typ zurückzukehren. Ihre Return-Anweisung gibt jedoch ...subscribe() zurück, die eine Subscription ist. Wenn Sie eine Observable zurückgeben möchten, rufen Sie nicht .subscribe(). Gib einfach zurück, was du bekommst approveTokenExpiration()

Du bist auf dem richtigen Weg. Die request Funktion sollte eine Observable zurückgeben. Es ist der aufrufende Code (Ihre Komponente), der .subscribe() auf diesem Observable aufrufen sollte, da es an diesem Punkt die Anforderung ausgelöst wird.

Verwandte Themen