Как я могу вернуть ошибки из компонента, прежде чем применять глобальный перехватчик http для обработки ошибок? - PullRequest
0 голосов
/ 03 мая 2018

В настоящее время я использую перехватчик http для обработки всех ошибок по всему миру. Например. если ошибка http возвращается как 404, отображается перехватчик с надписью «404: страница не найдена» перехватчиком http. Это отлично подходит для обработки всех ошибок в целом, но иногда, для определенных сервисных вызовов, я знаю, что проблема в том, что элемент не найден в магазине, а сервер возвращает 404. Вместо «страница не найдена» я хочу, чтобы он вернулся «товара нет в магазине» только для этого звонка. Остальные 404 ошибки могут быть обработаны в общем.

Однако я не уверен, как это сделать, поскольку перехватчик Http идет первым до обработки ошибок в моем сервисе / компоненте.

Вот мой http перехватчик на данный момент:

@Injectable()
export class RequestInterceptor implements HttpInterceptor {

  constructor(
    public errorHandler: ErrorHandler,
  ) {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return next.handle(request).do((event: HttpEvent<any>) => {}, (err: any) => {
      if (err instanceof HttpErrorResponse) {
        this.errorHandler.handleError(err);
      }
    });
  }
}

Вот мой обработчик ошибок:

@Injectable()
export class ErrorHandler {

  constructor(
    public snackbar: MatSnackBar, private router: Router
  ) {}

  public handleError(err: any) {

    if (err.status === 400) {
        this.snackbar.open('400: There was a bad request', 'close');
    } else if (err.status === 401) {
        this.snackbar.open('401: Unauthorized', 'close');
    } else if (err.status === 403) {
        this.snackbar.open('403: Forbidden', 'close');
    } else if (err.status === 404) {
        this.snackbar.open('404: Page not found', 'close');
    } else if (err.status === 500) {
        this.router.navigate(['/error']);
    } else {
        this.snackbar.open(err.message, 'close');
    }
  }
}

И, например, вот мой сервисный звонок, я хочу, чтобы ошибка появилась первой:

getProductByNumber(storeId: number, productNum: number): Observable<any> {
   this.products = this.baseUrl + '/products/' + storeId + '/' + productNum;
   return this.http.get<IProduct>(this.products).catch(this.errorHandler);
  }

, где

errorHandler(error: HttpErrorResponse) {
    if (error.status === 404) {
      this.openSnackBar('Product is not found in store');
      return Observable.throw(error.message || 'Server Error');
    } else {
      return Observable.throw(error.message || 'Server Error');
    }
  }
...