2017-10-30 14 views
2

@ ngrx/storeを使用してストアからトークンを取得してHTTPヘッダーに配置すると、フラットマップのmergeMapを使用しようとしましたが、それらはすべてHTTP要求を複製し続けます。 (1)それがループ要求とハングに行く取る、これは私が持っているものです。Observableを角型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

おそらくswitchMapを使用して、変更されたリクエストを実際にストリームに渡すだけでよいでしょう。 – bryan60

答えて

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

スイッチマップは、観察可能なものを取り、別のものにそれを切り替えます。また、観測可能なシーケンスでマップを使用する場合は、実際に値を渡す必要があります。個人的には、リクエストを最初の観測可能なストリームの一部にすることさえあります。

+0

それでも依然として各HTTP要求のクライアントからの要求を倍増します – ramon22

+1

あなたはおそらくtake(1)も必要とします: 'this.token $ .take(1).map(...)switchMap(...)' – Brandon

+0

Iあなたが誤ってどこかに2度購読してしまったので、あなたの観測はリクエストを2倍にしていると言います。傍受しないと一度だけ動くことを確認しましたか? – bryan60

関連する問題