Angular 6 使用新的 RxJS 处理 403 响应

Unk*_*ist 5 angular-http-interceptors angular

问题:

我有一个拦截器:

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

  constructor(private injector: Injector, private router: Router) {
  }


  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    const auth = this.injector.get(AuthenticationService);
    const authHeaders = auth.getAuthHeader();
    const authReq = request.clone({headers: authHeaders});

     return next.handle(authReq).do((event: HttpEvent<any>) => {
       if (event instanceof HttpResponse) {

       }
     }, (err: any) => {
       if (err instanceof HttpErrorResponse) {
         if (err.status === 403) {
           this.router.navigate(['login']);
         }
       }
     });
  }
}
Run Code Online (Sandbox Code Playgroud)

它在 Angular 5 中很旧,但现在我已经迁移到 6 并且这不再起作用了。

它说 Observable 类型上不存在属性“do”。

我也试图从这个线程实现解决方案:LINK 没有工作。

主题说这是 rxjs 更改的结果。进行建议的更改后,问题仍然存在(现在用“tap”代替“do”)

这是导入部分:

// import {Observable} from "rxjs/Observable";
import {Observable} from "rxjs/Rx";
import { tap } from 'rxjs/operators';
Run Code Online (Sandbox Code Playgroud)

注意:注释行也已尝试过。

Unk*_*ist 0

解决方案:

  1. 运行“npm install rxjs-compat@6 --save”;
  2. 导入应该如下所示:
import {Observable} from 'rxjs';

import 'rxjs/add/operator/do';
Run Code Online (Sandbox Code Playgroud)
  1. 就我而言,无需更改“do”->“tap”;

  2. 如果使用角材料,则运行第一个命令后可能需要重新安装。