Angular6 HttpClient捕获错误不工作

Angular6 HttpClient捕获错误不工作,angular,rxjs,Angular,Rxjs,在401响应中完全忽略CatchError 我有一个处理oauth2身份验证的httpInterceptor 有关守则如下: import { filter, take, switchMap, map, catchError } from 'rxjs/operators'; //ommited if (authService.hasRefreshToken()) { return authService.doRefreshToken().pipe(switchMap(tokenRespo

在401响应中完全忽略CatchError

我有一个处理oauth2身份验证的httpInterceptor

有关守则如下:

import { filter, take, switchMap, map, catchError } from 'rxjs/operators';
//ommited
if (authService.hasRefreshToken()) {
    return authService.doRefreshToken().pipe(switchMap(tokenResponse => {
            const accessToken = tokenResponse['access_token'];
            this.tokenSubject.next(accessToken);
            return <Observable<HttpEvent<any>>> next.handle(this.addToken(req, accessToken));
        }), catchError((err: any, caught: any) => {
            console.log(err)
            return Observable.throw(err);
        })
    )
}
标题:

 Request Method: POST
 Status Code: 401 

我遇到了同样的问题,即
catchError
函数被完全忽略。由于@seabickit使用的这段简单而直接的代码(如官方所述)不起作用,我放弃了处理错误响应的方法,转而研究了httpinterceptor。这就成功了

我受到Luuk Gruijs在其文章中的指导,在我的代码中添加了如下所示的
ErrorInterceptor

诚然,下面的拦截器可能不是一个完美的拦截器,但处理拦截器中错误的最重要部分归结为:

next.handle(request).pipe(tap(
  (event: HttpEvent<any>) => { },
  (error: any) => {
    // Handle errors here!
  }
))
希望在拦截器中处理错误也能为您带来好处

Observable.throw()
不能在返回语句中使用

这就是为什么在
AuthService.doRefreshToken

Observable.throw()
抛出一个错误,这就是为什么不允许在
return
语句中使用它的原因

这和下面一样

return throw Error("")
你很容易从你的同事那里得到抱怨


无论如何,由于这是一个老问题,您应该使用新的API,但我希望这可以帮助旧rxjs API的用户。

doRefreshToken()工作正常吗?doRefreshToken()中catchError上的断点在消息处显示意外的输入结束。当响应为200且令牌更新成功时,此方法确实可以很好地工作。@Seabitch您找到过解决此问题的方法吗?我也遇到了同样的问题,400条回复没有出现在catchError上……不是真的。我升级到angular 6后,它就停止工作了。幸运的是,我们仍在开发中,所以我把这个问题推到了积压工作的末尾,希望有人能在这里发布一些东西:)
next.handle(request).pipe(tap(
  (event: HttpEvent<any>) => { },
  (error: any) => {
    // Handle errors here!
  }
))
export class ErrorInterceptor implements HttpInterceptor {
  constructor() { }

  intercept (request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (request.method !== 'GET') {
      return next.handle(request);
    }

    const subject = new AsyncSubject<HttpEvent<any>>();

    next.handle(request)
    .pipe(
      tap((event: HttpEvent<any>) => {
        // Let HttpResponses pass through interceptor without interaction
        if (event instanceof HttpResponse) {
          subject.next(event);
          subject.complete();
        }
      }, (error: any) => {
        if (error instanceof HttpErrorResponse) {
          const errorEvent = new HttpResponse({
            body: {
              message: error.error.message,
              status: error.status,
              statusText: error.statusText
            }
          });

          subject.next(errorEvent);
          subject.complete();
        }
      })
    ).subscribe();

    return subject;
  }
}
return this.http.get<MyObjI | ErrorI>(url, {params});
export interface ErrorI {
  message: string;
  status: number;
  statusText: string;
}
return throw Error("")