【问题标题】:Rxjs Async Interceptors - Keep on getting an errorRxjs 异步拦截器 - 不断收到错误
【发布时间】:2019-03-12 01:58:24
【问题描述】:

我需要在我的拦截器中为请求添加一个令牌。我不断收到错误

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

【问题讨论】:

    标签: angular rxjs angular-httpclient angular-http-interceptors angular2-http


    【解决方案1】:

    知道了,这是一个非常愚蠢的错误

    我错过了返回 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);
          })
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-03
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2019-04-12
      • 2016-06-24
      相关资源
      最近更新 更多