angular - 如何在本地处理错误并跳过 Angular HTTP 拦截器?

标签 angular

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

我有一个特定的情况,我实际上期望和错误消息(UI 试图释放对刚刚删除的资源的锁定,所以我得到 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;
        }
      })
    );
}

但不仅是我的 intercepto 无论如何被调用,上面的 catchError block 根本没有执行(断点没有停止)。

我能否在不修改拦截器并保持类似单一职责的情况下实现我想要的?

谢谢!

最佳答案

我们可以通过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 HTTP 拦截器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72812501/

相关文章:

javascript - 使用清晰设计系统构建 Angular 2 应用程序

javascript - 来自变量的Angular ngFor轮播

html - 如何将下拉框(在表单中)的选定选项的值从 html 传递到 ts 文件,而无需在 Angular 中提交表单

angular - 如何使用 Angular 6/7 从 google 驱动器下载文件/视频?

angular - 为什么 ContentChild 未定义?

angular - 将模型/实体/对象添加到 Angular 2 中的 NgModule

Angular Testing - ngBootstraps typeahead

angular - ng build --prod 抛出异常

Angular HttpClient - rxjs 映射 - 到类型数组

java - Windows 7 中的 Protractor 问题