2

I need to add a token to the request in my interceptor. I keep on getting the error

core.js:1673 ERROR TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at subscribeTo (subscribeTo.js:41)
    at subscribeToResult (subscribeToResult.js:11)
    at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._innerSub (mergeMap.js:73)
    at MergeMapSubscriber.push../node_modules/rxjs/_esm5/internal/operators/mergeMap.js.MergeMapSubscriber._tryNext (mergeMap.js:68)
    at 

Getting the token is an async operation

In AuthService.ts, I have

  getToken2() {
    if (firebase.auth().currentUser) {
      return from(firebase.auth().currentUser.getIdToken());
    } else {
      return null;
    }
  }

My interceptor looks like below, but I keep on getting an error

import {
  HttpInterceptor,HttpRequest,HttpHandler,HttpEvent} from "@angular/common/http";
import { Observable } from "rxjs";
import { mergeMap, switchMap, flatMap } from "rxjs/operators";
import { Injectable } from "@angular/core";
import { AuthService } from "../auth/auth.service";

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor(private authService: AuthService) {}

  intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    const tokenObservable = this.authService.getToken2(); // if there is a user logged in
    if (tokenObservable) {
      tokenObservable.pipe(
        switchMap(token => {
          const copiedReq = req.clone({
            params: req.params.set("auth", token)
          });
          return next.handle(copiedReq);
        })
      );
    } else {
      return next.handle(req);
    }
  }
}

1 Answer 1

1

Got it, it was a really silly mistake

I was missing the "return" in return this.authService.getToken2().pipe(

  intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    console.log("Attempt Intercept");
    if (req.method === "GET") {
      return next.handle(req);
    }
    return this.authService.getToken2().pipe(
      switchMap(token => {
        console.log("[AuthInterceptro]: token ", token);
        const copiedReq = req.clone({
          // headers: req.headers.append('', '')
          params: req.params.set("auth", token)
        });
        return next.handle(copiedReq);
      })
    );
  }
}
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.