2017-10-20 5 views
1

Ich versuche, meinen ersten Code 401 Fehler mit HttpInterceptor zu fangen. Was ich tun möchte, hängt von einer Bedingung ab, die ein neues Authentifizierungs-Token erstellt und dann erneut versucht. Aber derzeit macht mein Code die Wiederholung, aber es tut es, bevor das neue Authentifizierungs-Token erstellt wurde. Hier ist mein Code:HttpInterceptor wiederholen in Angular 4.3

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

    return next.handle(request).catch(error => { 

     if (error.status === 401) { 

      console.log('401 error'); 

      //check for valid refresh token 
      let refreshToken = localStorage.getItem('refresh_token'); 

      this._refreshTokenService.getRefreshToken(refreshToken).subscribe(
       refreshToken => { 
        if (refreshToken != null) { 

         console.log('valid refresh token') 

         //if valid refresh token, relogin and create new auth token 
         console.log(localStorage.getItem('auth_token')); 

         this._userService.logout(); 

         let email = localStorage.getItem('profile_email'); 

         this._userService.autoLogin(email) 
          .subscribe(
          result => { 
           if (result) { 
            console.log('new auth token created'); 

            let auth_token = localStorage.getItem('auth_token'); 

            //retry 
            request = request.clone({ headers: request.headers.set('Authorization', `Bearer ${auth_token}`) }); 
           } 
          }); 


        } 
        else { 
         console.log('invalid refresh token'); 
        } 
       }); 
      return next.handle(request); 
     } 
     else { 
      console.log(error.status); 
     } 
    }); 
} 

Ich bin immer noch vertraut mit Typoskript Syntax immer, ich glaube, ich brauche die Wiederholung nur zu machen, auftritt, nachdem die neuen Token erstellt wurden, aber ich bin mir nicht sicher über die genaue Syntax in diesem Fall. Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Sorry ich kann nicht in den Kommentaren antworten. Ich denke, hier geht es darum, Observable zu verketten.

Grundsätzlich alles, was Sie anrufen, bevor Ihre letzte return next.handle(request); verarbeitet wird, bevor eckig machen Sie Ihren http-Aufruf. Nur dass alles innerhalb this._refreshTokenService.getRefreshToken(refreshToken).subsribe() asynchron verarbeitet wird.

sollten Sie ketten Ihre beobachtbare wie folgt aus:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<any> { 
    return next.handle(request).catch(error => { 
     return this._refreshTokenService.getRefreshToken(refreshToken).subscribe(
      refreshToken => { 
       return next.handle(request); 
      } 
     ); 
    }); 
} 
+0

Hallo, vielen Dank für Ihre Antwort. Ich habe versucht, die Zeile 'return next.handle (request)' so zu verschieben, dass sie direkt hinter der Klonzeile steht, aber das gibt mir den Syntaxfehler 'Type void ist nicht dem Typ ObservableInput zuweisbar'. Ich denke, ich brauche die Return-Linie, wo ich es in meinem ursprünglichen Beitrag habe, aber wie verhindere ich, dass es ausgeführt wird, bevor der Rest des Codes ausgeführt wurde? – user517406

+0

Auch ich habe Ihr Beispiel versucht und es gibt Fehler 'Type Subscription ist nicht dem Typ ObservableInput zuweisbar'. Dies ist wahrscheinlich nicht so schwer zu lösen, aber die Syntax ist schwer zu verstehen :) – user517406

Verwandte Themen