Обрабатывать ошибки HTTP с HTTPErrorResponse - компонент или служба? - PullRequest
0 голосов
/ 26 апреля 2018

В Angular есть общий способ обработки ошибок http с помощью HttpErrorResponse, как я видел? Это правда?

Второе, что меня интересует, - где мне это использовать, в службе, где я выполняю вызовы API, или в компоненте, где я вызываю службу?

Обработка ошибок в компоненте:

enter image description here

Обработка ошибок в сервисе:

@Injectable()
export class ArticleService {

  constructor(private _http: HttpClient) { }

  private apiUrl = environment.apiUrl;

  getArticles(): Observable<People[]> {
    return this._http.get<People>(this.apiUrl + '/People/GetAll')
      .catch(this.handleError);
  }
  private handleError(err: HttpErrorResponse) {
    console.log(err.message);
    return Observable.throw(err.message);
  }

Так что мне интересно, какой из этих способов лучше, и более удобный, следуя документации Angular?

А почему?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

В Angular есть общий способ обработки ошибок http с помощью HttpErrorResponse

& rarr; да и нет.

Это распространено, но это не лучшая практика.

Лучше всего использовать перехватчик , например, так:

export class ErrorHandlerService implements HttpInterceptor {

  constructor() {}

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next
      .handle(req)
      .catch((err: HttpErrorResponse) => {...});
  }

}

Что касается местоположения вашей функции, использование перехватчика решает эту проблему, но я напоминаю вам о лучшей практике:

& rarr; Вы должны сохранить логику, связанную с шаблоном, в своем компоненте и логику, связанную с бизнесом, в своем сервисе.

Я не помню точно, где это указано в документации, но я на 100% уверен в этом. РЕДАКТИРОВАТЬ Вот оно.

0 голосов
/ 26 апреля 2018

Вы должны обрабатывать ошибки в глобальном обработчике ошибок с помощью Angular ErrorHandler https://angular.io/api/core/ErrorHandler

Создайте новый класс, который реализует ErrorHandler и обрабатывает ошибки там. Я использую этот подход в производстве. Таким образом, установите сообщение об ошибке и сгенерируйте ошибку, и она попадет в глобальный обработчик ошибок. где вы можете уведомить пользователя с помощью любой службы уведомлений (например, Toastr). Кроме того, зарегистрируйте ошибку, если хотите. Вам не нужно многократно писать один и тот же код во всем приложении несколько раз.

...