Угловой наблюдаемый HttpClient не завершается - PullRequest
1 голос
/ 05 июня 2019

У меня есть следующий код:

// in a service
downloadCSV(): Observable<Blob> {
  return this.httpClient.get(`${apiUrl}/a.csv`, {responseType: 'blob'});
}
// in component
onDownloadClicked(event: MouseEvent) {
  this.downloading = true;
  this.service.downloadCSV()
    .pipe(finalize(() => this.downloading = false))
    .subscribe(
      (data: Blob) => {
        console.log(data);
      },
      (error) => {
        console.error(error);
        alert('Sorry, something wet wrong. Try again.');
      },
      () => {
        console.log('completed!');
      }
    );
}

Данные записаны правильно, но 'завершено!' не зарегистрировано и финализация никогда не вызывается.

Edit:

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

Если перехватчик обойден (и аутентификация отключена на сервере), наблюдаемое завершается без ошибок.

Хотя я не понимаю, почему это происходит. Возможно, что-то связано с тем, что запрос клонирован?

//interceptor code
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  let scope: string;
  // only inject tokens for the following scopes
  if (req.url.indexOf('https://graph.microsoft.com') === 0) {
    scope = 'https://graph.microsoft.com';
  }
  else if (req.url.indexOf('https://management.azure.com') === 0) {
    scope = 'https://management.azure.com';
  }
  else if (req.url.indexOf(environment.apiUrl) === 0) {
    scope = environment.appId;
  }
  if (scope) {
    return this.authService.getToken(scope).pipe(
      switchMap((token) => {
        let newReq;
        if (token) {
          const JWT = `Bearer ${token}`;
          newReq = req.clone({
            setHeaders: {
              Authorization: JWT,
            }
          });
        }
        return next.handle(newReq || req);
      })
    );
  }
  else {
    return next.handle(req);
  }
}

1 Ответ

1 голос
/ 05 июня 2019

Оказывается, проблема была в функции getToken моей службы аутентификации.Я забыл завершить наблюдаемое после возвращения токена!Поскольку наблюдаемый httpClient.get переключается через мой наблюдаемый getToken, это приводило к тому, что моя подписка в onDownloadClicked никогда не завершалась.

// from my auth service
getToken(resource: string): Observable<string> {
  return Observable.create((observer: Observer<string>) => {
    this.context.acquireToken(resource, (error, token) => {
      if (token) {
        observer.next(token);
        observer.complete(); // this was missing
      }
      else {
        this.login();
      }
    });
  });
}
...