Наблюдаемая ошибка углового HTTP-запроса не обнаруживает ошибку?

Angular 6 с использованием HttpClient. На данный момент перехватчики не реализованы.

У меня есть служба администратора, в которой я выполняю http-вызов MSGraph. В этом случае я получаю сообщение об ошибке 400 неверный запрос, которое отправляю обработчику уведомлений.

Я вставил этот console.info, чтобы убедиться, что блок ошибок вообще срабатывает, и еще один cnosole.log, чтобы увидеть, являются ли «данные», возвращаемые с сервера, ошибкой.

Ни один из console.infos не запускается, но глобальный обработчик ошибок по-прежнему отображает в консоли ответ на 400 неверных запросов.

Я хотел бы иметь возможность использовать этот ответ и отображать удобное для пользователя сообщение.

Код:

this.http.get(this.GRAPH_ROOT_URL + this.APP_ID, { headers }).subscribe(data => {
  this.notification.done(data);
  console.info(data);
}), error => {
  this.notification.error(`Error getting users from Microsoft GRAPH API. Reason: ${error}`)
  console.info("this is observable error", error);
}

Какая версия Angular?

Cobus Kruger 11.10.2018 12:25

Извините, Angular6 - забыл добавить!

SebastianG 11.10.2018 12:26

добавить еще один параметр для подписки - полный обратный вызов и console.info там

Ludevik 11.10.2018 12:26

@Ludevik, можно было бы подробнее рассказать об этом? Не совсем уверен, как будет выглядеть этот параметр.

SebastianG 11.10.2018 12:52

я имел ввиду нормальный обратный вызов: () => console.info('Completed'). Функция подписки принимает 3 параметра - успех, ошибка и завершение, все это обратные вызовы, поэтому вы передаете туда некоторую функцию, точно так же, как функции, которые вы передаете для успеха и ошибки. Моя идея заключалась в том, чтобы был вызван полный обратный вызов.

Ludevik 11.10.2018 13:51
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
6
5
9 514
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Angular 6 использует RxJS 6, в который внесен ряд изменений. Предполагая, что вы это используете, я бы использовал вот что:

Вот что я бы использовал:

this.http.get(this.GRAPH_ROOT_URL + this.APP_ID, { headers })
    .pipe(catchError(err => {
      this.alert.error('There was an error getting data');
      return throwError(err);
    })).subscribe(data => this.notification.done(data));

Таким образом, вы используете pipe для вызова catchError, который правильно обрабатывает ошибки сервера.

Чтобы использовать catchError, вам нужно сначала импортировать его, например:

import { catchError } from 'rxjs/operators';

Просто попробовал это - единственная проблема - это часть .pipe(catchError - catchError нигде не определен / недоступен. Мне удалось импортировать throwError из rxjs. Я действительно использую RxJS6 - не последнюю версию, поскольку она вносит критические изменения во многие вещи, которые я использую. Но все же RxJS6

SebastianG 11.10.2018 12:52

Спасибо! Это работает именно так, как задумано. Как бы то ни было, мне нужно реорганизовать 20+ HTTP-запросов сейчас, надо было протестировать это намного раньше! Единственная проблема заключается в том, что теперь, когда я пытаюсь написать объект err в службе, он отображается как [объект объекта]; Я подозреваю, что это из-за порядка, в котором я работаю, и немного подправлю его.

SebastianG 11.10.2018 13:04

@SebastianG Пока вы собираетесь потратить время, сделайте еще один шаг и превратите HttpClient в собственный сервис. Это действительно упрощает такие вещи и дает вам дополнительные возможности. Например, мой реальный код также включает автоматический повтор для GET и визуальные уведомления об успехе или неудаче.

Cobus Kruger 11.10.2018 13:07

Есть ли шанс, что у вас есть этот пример где-нибудь на github, чтобы я мог посмотреть? Я оборачиваю все в сервис, просто у меня есть 4 сервиса с наблюдаемыми в 2 приложениях, над которыми я работаю сейчас, почти все они с архитектурой redux. Если мне удастся сделать это прямо на уровне обслуживания, будет совсем несложно использовать их в компонентах.

SebastianG 11.10.2018 13:19

Извини, нет. Моя служба в основном имеет те же функции Get, Post и т. д., Но добавляет вызовы pipe для catchError и retry (только для Get). Он также вызывает службу уведомлений, которая кажется похожей на вашу. Дело в том, что он дает вам возможности, и вы можете расширяться по своему желанию. У меня также есть определенные перегрузки, которые автоматически помещают отдельные объекты в массивы и так далее. Вы, вероятно, могли бы многое из этого сделать и с перехватчиками, но я всегда закрывал это.

Cobus Kruger 11.10.2018 13:27

Я понимаю, мой единственный вопрос - это логика повторной попытки. Это исключительно в случае тайм-аута или есть другие преимущества повторной попытки GET-запроса? Кстати, большое спасибо за вашу помощь, это было очень ценно для меня.

SebastianG 11.10.2018 13:28

Ага. Это простой .pipe(retry(2)), добавленный непосредственно перед моим pipe для catchError. Таким образом, он делает максимум три попытки и только потом возвращает ошибку. retry импортируется из того же модуля, что и catchError.

Cobus Kruger 11.10.2018 13:30

ха! это было бы очень ценно, не могу поверить, что не подумал об этом! Спасибо всем, чувак. Удачи!

SebastianG 11.10.2018 13:31

Это не работает. Ответ BadRequest по-прежнему вызывает исключение в браузере, но никогда не попадает в код.

Egor Pavlikhin 06.04.2020 08:38

Другие вопросы по теме