Установить заголовок авторизации, используя перехватчик, который содержит наблюдаемый для получения токена - PullRequest
0 голосов
/ 16 мая 2019

Я хотел использовать перехватчик для присоединения токена к заголовку запроса.Токен хранится с помощью @ngx-pwa/local-storage, который возвращает токен через Observable.

ERROR TypeError: "You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable."

Я сталкиваюсь с этой ошибкой через следующий код -

import { finalize } from 'rxjs/operators';
import { HttpClient, HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Injectable } from "@angular/core";
import { Observable } from "rxjs";
import { catchError, tap, map } from 'rxjs/operators';

import { LocalStorage } from '@ngx-pwa/local-storage';
import { User } from '../models/user';

@Injectable({
    providedIn: 'root'
})
export class httpInterceptorTokenService implements HttpInterceptor {

    constructor ( private localStorage: LocalStorage ) {  }

    private isAuthError(error: any): boolean {
      return error instanceof HttpErrorResponse && error.status == 401;
    }

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
      let intialRequest = req.clone();

      return next.handle(req).pipe(
        catchError((error) => {
          if (!this.isAuthError(error)) {
            return Observable.throw(error);
          }

          this.localStorage.getItem<User>('user').subscribe((userData:User) => {
            intialRequest = intialRequest.clone({
              setHeaders: {
                'Authorization': userData.token
              }
            });
            return next.handle(intialRequest).pipe(tap(res => res));
          }); // LOCAL-STORAGE
        })
      ); // RETURN
    } // INTERCEPT
} // EXPORT

Есть ли решение для этого или есть альтернативный способ присоединить токен к заголовку для каждого XHR?

1 Ответ

0 голосов
/ 16 мая 2019

Причиной ошибки является то, что вы не возвращаете наблюдаемое, если это ошибка авторизации. Оператор возврата находится внутри блока подписки. Кроме того, как указывал @ jriver27, вы добавляете заголовки запросов, куда вы направляетесь для обработки ответа об ошибке. Вам нужно разобраться с этим до того, как будет сделан http-вызов.

intercept(request: HttpRequest<any>, next: HttpHandler):   Observable<HttpEvent<any>> {
    let result: Observable<HttpEvent<any>> =    next.handle(this.addHeaders(request));
    return result;
}

private addHeaders(request: HttpRequest<any>):   HttpRequest<any> {
    const alteredRequest = request.clone({
      setHeaders: {
        Authorization: `Dummy-Auth   ${this.getDummyToken()}`
            }
    });
    return alteredRequest;
}
...