当前位置: 首页 > 知识库问答 >
问题:

角度6使用新RxJS处理403响应

姚洲
2023-03-14

问题是:

我有一个拦截器

@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']);
         }
       }
     });
  }
}

它在角5中工作,但现在我已经迁移到6,这不再工作了。

它表示属性do不存在于可观察类型上。

我还尝试从这个线程实现解决方案:LINK也不起作用。

本主题说这是rxjs更改的结果。进行建议的更改后,问题仍然存在(现在使用“点击”而不是“执行”)

这里是导入部分:

// import {Observable} from "rxjs/Observable";
import {Observable} from "rxjs/Rx";
import { tap } from 'rxjs/operators';

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

共有3个答案

严修德
2023-03-14

面对同样的问题,这是我如何解决的

>

  • ng更新(更新所有软件包并使其与角6兼容)
  • npm安装rxjs-compat@6-保存(安装更新版本的rxjs)
  • 在整个代码中替换以下函数,因为它们在rxjs中更新

    做=

    有关更多信息,请查看rxjs更改日志。

  • 蓬长恨
    2023-03-14

    如果错误为类型Observable上不存在属性“do”,请尝试导入运算符。将此项放在您的文件顶部:

    import 'rxjs/add/operator/do';
    
    司寇祺
    2023-03-14

    为了使我的项目(Angular 6,RxJS 6)能够正常工作,我必须进行以下更改:

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

    并将上面的代码段修改为:

    (链接更改为管道,并将“do”更改为“tap”)

    @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).pipe(
           tap((event: HttpEvent<any>) => {
             if (event instanceof HttpResponse) {
    
             }
           }, (err: any) => {
             if (err instanceof HttpErrorResponse) {
               if (err.status === 403) {
                 this.router.navigate(['login']);
               }
             }
           })
       );
      }
    }
    

    原因是RxJS 6最近发生了一些变化。

    使用管道而不是链接作为新的运算符语法。一个运算符的结果被传入另一个运算符。

    注意,由于与JavaScript保留字的名称冲突,某些运算符的名称发生了更改!这些包括:做什么-

     类似资料:
    • 我已经在谷歌上搜索过了,但我找不到解决办法。 我已经使用这样的代码有一段时间了。http是http客户端。 我更新到最新的Angular 6。x版本和RxJS 6(来自5.5)。现在代码正在抱怨catchError: 类型“操作员函数”的参数不能分配给类型“操作员函数”的参数。参数“源”和“源”的类型不兼容。类型'可观察'不能分配给类型'可观察'。 我的HttpInterceptor现在也无法编译

    • 我想按照这个答案从角度5迁移到角度6 我试着执行这三个命令,来更新。angular-cli.json到angular.json: 不幸的是,仍然没有angular.json。如果我试图运行< code>ng serve,我会得到以下错误: 所以我改名了。angular-cli.json到angular.json。但这并没有帮助: 架构验证失败,出现以下错误:数据路径“”不应具有其他属性(项目)。错

    • 我有一个Angular 6客户端,它使用了使用.Net Web Api开发的REST Api。 除了错误处理之外,一切都正常。当我试图处理错误以对不同的状态代码(404403409500…)做出不同的反应时,我根本无法让它工作。HttpErrorResponse对象没有任何应该包含的字段(如“状态”或“错误”)。 我做了一个超级简单的服务来重现这个问题: 对服务的请求 错误处理程序(几乎直接来自官

    • 我有一个服务,有一个方法foo。在该方法中,我订阅了一个可观察的(超文本传输协议-客户端)。 我喜欢从foo返回一个布尔值,该值取决于get。这不起作用,因为http.get是asynchrouns-在http.get完成之前调用return。 我怎样才能使这个同步? 编辑 返回可观察的布尔值在这里不是一个选项。这是因为我处理get in foo的响应(此处未显示),但我也需要根据它的返回来执行f

    • 我正在开发angular 7应用程序,但在get请求中遇到了问题。 以下是错误: 这是我的角色服务。ts: 这是组件。输电系统 当服务器向我发送请求的数据时,我不明白这个错误来自哪里。 提前谢谢你!!!

    • 以下代码未订阅: 但是如果我这样做,它确实订阅: 更新:这个工作太 但当我添加逻辑时,它并没有 我遵循RxJS官方文档:https://rxjs-dev.firebaseapp.com/api/operators/find 我甚至必须在,当我执行时,什么也不会打印出来。我也尝试过使用管道。 对象: 我传递的昵称是将对象与“Devpato”进行比较