2017-10-30 4 views
2

Ich benutze @ ngrx/store um ein Token aus dem Speicher zu bekommen und es in HTTP-Header, versuchte ich mit Flatmap mergeMap, aber sie alle duplizieren die HTTP-Anfragen und wenn ich benutze nehmen (1) geht es auf der Schleife Anfrage und hängt, ist es das, was ich habe:Rückgabe eines Observable in einem Angular HttpInterceptor

@Injectable() 
export class AuthInterceptorService implements HttpInterceptor { 
    token$: Observable<string>; 

    constructor(private readonly store: Store<fromRoot.State>) { 
     this.token$ = store.select(fromAuth.getToken); 
    } 

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

     return this.token$ 
       .map(token => { 
        if (token) { 
        request = request.clone({setHeaders: {Authorization: `Bearer ${token}`}}); 
        } 
       }) 
       .mergeMap(() => next.handle(request)); 
    } 
} 
+0

Sie müssen wahrscheinlich nur switchMap verwenden und Ihre modifizierte Anfrage tatsächlich über den Stream weiterleiten. – bryan60

Antwort

4
return this.token$ 
      .map(token => { 
       if (token) { 
       request = request.clone({setHeaders: {Authorization: `Bearer ${token}`}}); 
       } 
       return request; 
      }) 
      .switchMap((req) => next.handle(req)); 

Karte wechselt eine beobachtbare nimmt und schaltet ihn in einer anderen. Sie müssen auch einen Wert übergeben, wenn Sie die Karte in einer beobachtbaren Reihenfolge verwenden. Ich persönlich würde die Anfrage sogar zu einem Teil des beobachtbaren Stroms machen.

+0

verdoppelt es immer noch die Anforderungen, die vom Client für jede HTTP-Anfrage gestellt werden – ramon22

+1

Sie brauchen wahrscheinlich auch (1): 'this.token $ .take (1) .map (...). SwitchMap (...)' – Brandon

+0

I Ich werde auf jeden Fall aussteigen und sagen, dass Ihr Observable Anfragen verdoppelt, weil Sie versehentlich zweimal irgendwo abonniert haben. hast du bestätigt es läuft nur einmal wenn du nicht abfängst? – bryan60

Verwandte Themen