首页 > 解决方案 > 将管道停在中间

问题描述

在我的角度应用程序中,我有一个令牌刷新拦截器,它拦截 401-未经授权的错误,尝试刷新访问令牌,并再次执行原始 http 请求。

在某些情况下,令牌刷新端点也可能会失败,并返回一个已知错误(在我的情况下是 400 invalid_grant 错误)。

刷新令牌的拦截器部分:

 return this.httpClient
  .request('POST', "token", { observe: 'response' })
  .pipe(
    map(response => {
      // some logic when the token was refreshed successfully
    }),
    catchError(err => {
      this.routingService.navigateToLoginNoQuery();
      return throwError(err); // a 400 - invalid_grant error
    })
  );

发生这种情况时,它会到达一个 catchError 运算符,它会做两件事:注销(重定向到登录页面),并返回 throwError(error),它抛出的这个错误是 400-Invalid_grant 错误。

这会导致新错误到达最初触发刷新令牌的函数中的某些 catchError 运算符。

仅出于上下文考虑:我将错误记录在 catch 块中,并且我想避免记录此类错误,因为它们通常仅意味着用户的令牌已过期。

我想做的是以某种方式停止这个运营商链,然后重定向到登录页面。

是否可以在中间停止管道,并避免同时到达外部 catchError 和管道中的下一个运算符?

标签: angularrxjsrefresh-token

解决方案


您可以返回一个空Observable值以防止事件或错误到达将要被销毁的组件:

return this.httpClient
  .request('POST', "token", { observe: 'response' })
  .pipe(
    map(response => {
      // some logic when the token was refreshed successfully
    }),
    catchError(err => {
      this.routingService.navigateToLoginNoQuery();
      return EMPTY;
    })
  );

推荐阅读