拦截处理http错误导致问题

时间:2020-12-31 14:06:25

标签: angular angular-http-interceptors

我正在 Angular 10 中开发一个项目。我创建了一个 Http 拦截器来处理 http 错误。我使用过 "map""of" 运算符。但它显示以下错误:

<块引用>

'Observable' 类型不存在属性 'map'。
14 .map(resp => {

“typeof Observable”类型不存在“of”属性。 31 Observable.of(err);

这是我的拦截器代码:

import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';

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

  constructor() { }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req)
      .map(resp => {
        if (resp instanceof HttpResponse) {
          return resp;
        }
      })
      .catch(err => {
        console.log(err);
        
        if (err instanceof HttpErrorResponse) {
          console.log(err.status);
          console.log(err.statusText);
          
          if (err.status === 401) {
            // redirect the user to login page
            // 401 unauthorised user
          }          
        }
        return Observable.of(err);
      });
  }
}

谁能建议我的代码有什么问题。

2 个答案:

答案 0 :(得分:1)

我没有阅读您的整个代码,但从您的错误判断您可以使用 of 运算符修复它:

代替 return Observable.of(err);return of(err); 并添加一个 import `import { Observable, of } from 'rxjs';

编辑

正如 MikeOne 所评论的,您还需要使用地图运算符:

import { catchError, map } from 'rxjs/operators';
...
return next.handle(req)
    .pipe(
      map(resp => { ... }),
      catchError(err => { ... })
    );

`

答案 1 :(得分:1)

map 对象中不再有 catchObservable 运算符

改用 pipe :

import { catchError, map } from 'rxjs/operators';

//...
return next.handle(req)
    .pipe(
      map(resp => {
        //....
      }),
      catchError(err => {
        //...
      })
    );