HttpRequest отменяется при перехвате - PullRequest
0 голосов
/ 30 марта 2019

Проблема

Я использую HttpInterceptor для добавления заголовка Authorize ко всем моим HTTP-запросам.Запросы отправляются в AWS API Gateway.Но, к сожалению, все мои запросы отменяются, если я их перехватываю.

Если я добавлю заголовок непосредственно в запрос, все будет работать, как ожидалось, но при получении асинхронным токеном мои первые запросы не будут выполнены, так как токен еще не доступен.Вот почему я добавил перехватчик, который выглядит следующим образом, где this.getSession () возвращает Observable из Promise:

intercept (request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {       
        return this.getSession()
            .mergeMap((session: CognitoUserSession) => {   
                if(session.getIdToken()){
                    request = request.clone({
                        setHeaders: {
                            Authorization: session.getIdToken().getJwtToken()
                        }
                    });  
                }
                return next.handle(request);
         });
    }

Сам запрос выполняется следующим образом:

getStoreList(): Observable<string[]> {
 let uri = endpoint + 'getStores';
 return this.http.get<string[]>(uri, {headers: httpHeaders}).pipe(
   map((data) => {
     return data;
 }));
}

this.updateHistoryService.getStoreList()
      .subscribe((data: string[]) => {
        this.stores = ["all", ...data];
        this.getData();
});

Но это приводит к: "XHR не удалось загрузить: ОПЦИИ" https: //....eu-central-1.amazonaws.com/dev/getStores "" (IЯ использую CORS, поэтому перед отправкой отправляется запрос.)

Что я пробовал

Если я изменю эту строку:

return next.handle(request);

на:

return from(next.handle(request).toPromise());

//the following works as well:
return next.handle(request).toPromise();

Я вижу в консоли, что данные успешно загружаются с сервера без отмены каких-либо запросов, но мой обратный вызов никогда не вызывается таким образом, поэтому я не могу обработать данные.

1 Ответ

0 голосов
/ 08 апреля 2019

Я заработал, добавив .pipe(takeWhile(() => this.alive)).Выглядит так:

return this.getSession()
   .pipe(takeWhile(() => this.alive))
        .mergeMap((session: CognitoUserSession) => {   
            if(session.getIdToken()){
                request = request.clone({
                    setHeaders: {
                        Authorization: session.getIdToken().getJwtToken()
                    }
                });  
            }
            return next.handle(request);
     });
...