如何在Angular拦截器中阻止错误传播

时间:2018-05-23 17:04:02

标签: angular error-handling interceptor

我的Angular应用程序中有一个http拦截器:

@Injectable()
export class ResponseInterceptor implements HttpInterceptor {

  constructor(private messageService: MessageService) {}

  intercept( req: HttpRequest<any>, next: HttpHandler ): Observable<HttpEvent<any>> {
    return next
      .handle( req ).pipe(
        tap(event => {
          if (event instanceof HttpResponse) {
            Logger.log('Successful HTTP request in interceptor');
          }
        }, (error: any) => {
          const notFoundError = ErrorCodes.getErrorDescription(error.status);
          if (notFoundError) {
            this.messageService.show(errorMessage);
          } else {
            return Observable.throw( error );
          }

        }
      ));
  }
}

当存在notFoundError时,我的应用程序正确显示了我想要的消息,但似乎错误传播回服务中的错误处理程序,我得到了一个 &#34;错误错误:未捕获(承诺):HttpErrorResponse&#34;在控制台中。有没有办法阻止拦截器中的错误?

我的意思是我会在这里处理常见错误,只会将其他错误传播回服务。

3 个答案:

答案 0 :(得分:0)

您是否尝试从Observable返回空?

if (notFoundError) {
   return Observable.empty();
} else {
   return Observable.throw( error );
}

答案 1 :(得分:0)

我正在使用rxjs 6:

import {EMPTY} from 'rxjs';

//in your try/catch, interceptor, if statement, etc. 
return EMPTY;

摘自文档:

  

创建一个不向观察者发射任何项目的Observable,   立即发出完整的通知。

答案 2 :(得分:-1)

试试这个:

intercept (request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  return next.handle(request)
  .pipe(
    catchError((error: HttpErrorResponse) => {
      if (error.status === 401) {
        alert('Please log in.')
        return throwError(null)
      }
      return throwError(error)
    })
  )
}