代码之家  ›  专栏  ›  技术社区  ›  Asool

Rxjs异步拦截器-不断获取错误

  •  2
  • Asool  · 技术社区  · 7 年前

    我需要在我的拦截器中为请求添加一个令牌。我一直在犯错误

    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 
    

    在AuthService.ts中,我有

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

    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 回复  |  直到 7 年前
        1
  •  1
  •   Asool    7 年前

    明白了,这真是个愚蠢的错误

    我在return this.authService.getToken2().pipe中缺少了“return”(

      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);
          })
        );
      }
    }