angular - 错误 : "You provided ' undefined' where a stream was expected. 您可以在我的身份验证拦截器中提供 Observable、Promise、Array 或 Iterable。”

标签 angular typescript observable angular8 angular-http-interceptors

我想拦截对 api 的每个请求并检查状态代码,以便它可以显示消息或重定向到特定组件,但它给出以下错误:

main.js:1580 TypeError: You provided 'undefined' where a stream was expected. You can provide an >Observable, Promise, Array, or Iterable.at subscribeTo (vendor.js:179688)at subscribeToResult(vendor.js:179824) at MergeMapSubscriber._innerSub (vendor.js:175271) at mergeMapSubscriber._tryNext (vendor.js:175265) at MergeMapSubscriber._next (vendor.js:175248) at MergeMapSubscriber.next (vendor.js:170316) at Observable._subscribe (vendor.js:172287) at Observable._trySubscribe (vendor.js:169772) at Observable.subscribe (vendor.js:169758) at MergeMapOperator.call (vendor.js:175233)

这是我的AuthInterceptor:

import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { tap } from 'rxjs/operators'; 
import { CommonService } from '../common.service';
import { Router } from '@angular/router';
import { AuthenticationService } from './authentication.service';


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

  constructor(
    private common: CommonService,
    private router: Router,
    private auth: AuthenticationService
  ) { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (req.headers.get('No-Auth') === 'True') {
      return next.handle(req.clone());
    }
    // To attach header on every request
    if (localStorage.getItem('currentUser') != null) {
      const clonedreq = req.clone({
        headers: req.headers.set('Authorization', 'Bearer ' + localStorage.getItem('currentUser'))
      });
      return next.handle(clonedreq).pipe(tap(
        succ => { },
        err => {
          if (err.status === 401) {
            this.router.navigateByUrl('/login');
          } else if (err.status === 403) {
            this.router.navigateByUrl('/Forbidden');
          } else if (err.status === 400) {
            this.router.navigateByUrl('/error404');
          }
        }
      ));
    } else {
      this.router.navigateByUrl('/login');
    }
  }
}

我无法找出导致它的行或 block ,因为它没有写在错误中的任何位置。该项目编译得很好。 该错误几乎出现在向 WEB Api 发送请求的项目的每个页面中。

最佳答案

在 else block 中,您缺少 return 语句。 添加 当 localStorage.getItem('currentUser') 为 null 时,在 else block 中返回 next.handle(req.clone());

关于angular - 错误 : "You provided ' undefined' where a stream was expected. 您可以在我的身份验证拦截器中提供 Observable、Promise、Array 或 Iterable。”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59464682/

相关文章:

angular - 如何在 codemirror 上显示 JSON?

javascript - 输入 '{ visibility: string; ' line-join' : string; 'line-cap' : string; } | { visibility: string; }' is not assignable to type

angular - 无法绑定(bind)到 'value',因为它不是 'p-dataTable' 的已知属性

Angular 9 "No value provided for @angular/core symbol ' ɵɵinjectPipeChangeDetectorRef'。”(IVY)

angular - Http 获取 + NgFor

javascript - 在一个函数中同时处理 React.KeyboardEvent 或 React.MouseEvent

angular - 组件类变量的初始化

angular - RxJs:forkJoin() 未运行,因为我的可观察列表不完整

system.reactive - 如何在 ReactiveUI 中使用 WhenAny(...) 合并多个 observables?

javascript - RxJs-Observable-如何从 JSON 对象获取数据