在 Angular 6+ HttpInterceptor 中将成功响应更改为错误

问题描述 投票:0回答:4

我需要一个 HttpInterceptor,它将 Http 200 成功响应更改为 500 Http 错误。

但是我有一个有效的拦截器,但是当需要将成功的答案转换为错误时,http订阅者直接调用“完整”处理程序(既不调用下一个也不调用错误处理程序)。

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next
      .handle(request)
      .pipe(
        map((event: HttpEvent<any>):any => {
          let type = this.convertTypeToString(event.type);
          if (type === "Response") {
            let error: HttpErrorResponse = new HttpErrorResponse({status: 500});
            return Observable.create(observer => observer.error(error));
          }
          return event;
        })
      );
}

预期行为:当我触发时,例如登录调用,我想返回 - 即使成功登录 - Http 500 错误。

angular-http-interceptors
4个回答
2
投票

解决方案是根本不使用 HttpHandler 进行调用。只需提供一个返回错误的 Observable:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  let error: HttpErrorResponse = new HttpErrorResponse({status: 500});
  return Observable.create(observer => observer.error(error));
}

HttpHandler 的作用是“为您”发出请求。但是,当请求成功时,很难(不可能?)将其重定向到错误响应。因此,跳过 next.handle() 调用并通过返回 Observable 来模拟调用。


0
投票

您可以使用 throwError Observer 返回观察者表单成功处理程序。

import { throwError } from 'rxjs';

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next
      .handle(request)
      .pipe(
        map((event: HttpEvent<any>):any => {
          let type = this.convertTypeToString(event.type);
          if (type === "Response") {
            let error: HttpErrorResponse = new HttpErrorResponse({status: 500});
            return throwError(err);
          }
          return event;
        })
      );
}

0
投票
@Injectable()
export class ErrorSimInterceptor implements HttpInterceptor {
  intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
    return throwError(() => new HttpHeaderResponse({ status: 500}));
  }
}

0
投票

像往常一样,有不止一种方法可以做到这一点。您可以按照建议使用

throwError
,但是您必须将
pipe
方法中的函数从
map
更改为
switchMap
。这是因为
throwError
返回一个可观察值。此外,在非错误情况下,您仍然必须返回一个可观察值。那么你的返回值将是
of(event)

这可行,但在我看来,简单地抛出您已经在代码中创建的 HttpErrorResponse 是一个更简单的解决方案。那么您就不必使用

switchMap
of
。如果我没有犯任何可怕的错误,这里是你的函数稍微修改以获得你想要的结果:

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next
      .handle(request)
      .pipe(
        map((event: HttpEvent<any>):any => {
          let type = this.convertTypeToString(event.type);

          if (type === "Response") {
            let error: HttpErrorResponse = new HttpErrorResponse({status: 500});
            throw error;
          }

          return event;
        })
      );
}
© www.soinside.com 2019 - 2024. All rights reserved.