angular - Typescript Angular2-fel när man returnerar ett löfte och skapar ett observerbart från det


Jag försöker hämta en token från Ionics storage i getToken() och sedan använda den i refreshToken() för att se om token har gått ut genom att skicka den till (this.jwtHelper.isTokenExpired(this.token) som returnerar sant eller falskt beroende på om token har gått ut eller inte. Jag har lagt till kommentarer i refreshToken() där jag får följande fel

Fel 1:

Fel: TS2345: Argument av typen '(response: Response) => void' kan inte tilldelas parametern av typen '(value: Response) => void'. Typerna av parametrarna 'response' och 'value' är oförenliga. Typen 'Response' kan inte tilldelas typen 'Response'. Två olika typer med detta namn finns, men de är inte relaterade. Egenskapen 'body' saknas i typen 'Response'.

Fel 2:

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

Min kod

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);
            });
      }
    });
}

Svar #1

Du importerar inte Response i din kod. Kompilatorn blev troligen förvirrad om vilken Response som skulle användas eftersom det kan finnas flera definitioner i dina typer :

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

Dessutom returnerar du inte observablen inuti flatMap. Du returnerar Subscription. Returnera den ursprungliga observablen så här:

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;
}

Svar #2

Funktionen refreshToken är felaktig

  • Du får inte prenumerera inuti operatorer i RxJS
  • Get returnerar en Observable (eller ett löfte som det verkar i ditt fall)

Prova följande:

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
    })
}

Relaterade artiklar