我有一个Angular HttpInterceptor捕捉错误,并根据状态代码显示适当但通用的错误消息.

我有一个具体的例子,我实际上expect和错误消息(用户界面试图释放一个刚刚被删除的资源锁,所以我得到404).

在这种情况下,我希望在进行API调用的地方直接处理错误,并跳过拦截器.

我试过这个:

releaseReviewerLock(itemType: EquipmentItemType, itemId: EquipmentItem["id"]): Observable<void> {
  return this.http
    .post<void>(`${this.configUrl}/${itemType.toLowerCase()}/${itemId}/release-reviewer-lock/`, {})
    .pipe(
      catchError(e => {
        if (e.status === HttpStatusCode.NotFound) {
          // We can ignore the 404 because the item has just been deleted, so there's nothing to release.
          return EMPTY;
        }
      })
    );
}

但不管怎样,不仅我的拦截器被调用了,上面的catchError块根本没有被执行(断点没有停止).

我能在不修改拦截器和保持单一责任相似的情况下实现我想要的吗?

谢谢

推荐答案

我们可以通过some metadata contextHttpClient,然后在HttpInterceptor中检索它.

当然,这意味着要在HttpInterceptor中添加一些逻辑,但多亏了元数据上下文,这段代码可以更加通用,并且保持简单.

例如:

api.service.ts:

this.httpClient
  .get('http://...', {
    context: new HttpContext().set(IGNORED_STATUSES, [404]),
  })
  .pipe(
    catchError((e) => {
      console.log('Error catched locally', e);
      return of(EMPTY);
    })
  )
  .subscribe();

error.interceptor.ts:

export const IGNORED_STATUSES = new HttpContextToken<number[]>(() => []);

export class CustomHttpInterceptor implements HttpInterceptor {
  intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    const ignoredStatuses = req.context.get(IGNORED_STATUSES);

    return next.handle(req).pipe(
      catchError((e: HttpErrorResponse) => {

        // if ignored statuses are set
        // and returned status matched 
        if (ignoredStatuses?.includes(e.status)) {
          // rethrow error to be catched locally
          return throwError(() => e);
        }

        // process error...
        console.log('error interceptor !!', e);
        return of();
      })
    );
  }
}

Angular相关问答推荐

无法添加@angular/pwa

访问Angular 模板中的HTML元素属性

带信号数据源的17角material 表

更改动态表单控制Angular 的值

弯管记忆

错误TS2531:对象可能为空.论窗体数组控件

RxJS轮询+使用退避策略重试

Angular-每2个流式传输多个HTTP调用

Angular Http 拦截器 - 修改标头会导致 CORS

URL 更改但组件未在 Angular 导航中呈现

角 12 固态继电器 |页眉页脚在加载程序到来之前显示

无法获得 angular-material md-sidenav 的 100% 高度

获取从(keypress)angular2按下的键

angular 2模板使用console.log

如何添加/设置环境 Angular 6 angular.json 文件

如何为 Angular 2 中的渲染元素绑定事件监听器?

MatToolbar 与 Angular 9 一起使用时抛出错误

Angular 2 可用的 yeoman 生成器

ngClass 中的多个条件 - Angular 4

Angular 2 反转 *ngFor