2017-10-30 3 views
2

@ ngrx/store을 사용하여 저장소에서 토큰을 가져 와서 HTTP 헤더에 배치하면 flatmap mergeMap을 사용했지만 모두 HTTP 요청을 복제하고 계속 사용합니다. (1) 루프 요청 및 중단에 간다 가지고, 이것은 내가 무엇을 가지고 :Observable from Angular HttpInterceptor Observable에서

@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 너는 우연히 두 번 어딘가에 가입했기 때문에 관찰 할 수있는 것이 두 배로 늘어나고 있다고 말한다. 당신이 도청하지 않으면 한번만 작동한다는 것을 확인 했습니까? – bryan60

관련 문제