Angular, перехватчик ошибок, повторите исходный запрос по другому URL - PullRequest
3 голосов
/ 03 мая 2019

Я начал работать с Angular несколько месяцев назад над новым проектом, но теперь мне нужно написать более сложный перехватчик ошибок, который будет определять, когда внутренний API не работает.

Перехватчик должен обнаруживатьHTTP-код ошибки и, если сервер не работает, мне нужно выполнить запрос к стороннему API-серверу и получить список доступных URL-адресов внутреннего сервера, пропинговать каждый сервер из этого списка, пока не будет найден один UP, и повторить исходный запрос.(в основном для изменения базового URL).

Вот шаги, которые должен сделать перехватчик:

  1. проверить код ошибки, если код равен 0, вызвать метод для обработкипроблема
  2. выполнить запрос к другому API и получить список всех доступных серверов
  3. Выполнить итерацию по списку и пропинговать каждый сервер из этого списка.
  4. Когда доступносерверы найдены, повторите исходный запрос.

В моем случае обычным запросом будет получение списка проектов:

getProjects() {
    return this.http.get<IProject[]>('/projects');
  }

базовый URL отсутствует, потому что я использую другой перехватчик для его динамического добавления.

Метод, который получает список доступных URL-адресов внутреннего сервера:

getRoutes() {
    return this.http.get<IRoute[]>(this.API_URL + '/routes');
  }

и службы, которые могут пропинговатьсервис

ping(url: string) {
    return this.http.get(url, { observe: 'response', responseType: 'text' });
  }

Пока здесь все не работает как положено.

Теперь перехватчик:

intercept(request, next) {
    return next.handle(request).pipe(
      catchError((error: any) => {
        if (error.status === 0) {
          return this.handleServerDownError(request, next);
        }
        return throwError(error);
      })
    );
  }

handleServerDownError(request, next) {
    return this.routesService.getRoutes().pipe(
      map(routes => {        
         routes.map((route: IRoute) =>
            this.pingService.ping(route.value).subscribe(res => {
              if (res.status === 200) {
                const updatedReq = request.clone({
                  url: route.value + request.url
                });
                return next.handle(updatedReq);
              }
            })
          );
      })
    );
  }

Я почти получил, я работаю, но, конечно, метод ping возвращаеттот же код ошибки, если проверенный сервер не работает, и я получаю тот же код ошибки, и я вхожу в бесконечный цикл.

Есть идеи, как заставить его работать?Может быть, я могу изменить метод ping, возвращающий другой код?

Также, как я могу прекратить итерации в функции карты после того, как найден первый доступный сервер?

Заранее спасибо!

1 Ответ

1 голос
/ 03 мая 2019

Я почти получил работу, но, конечно, метод ping возвращает тот же код ошибки, если проверенный сервер не работает, и я получаю тот же код ошибки, и я вхожу в бесконечный цикл.

Для этого вы можете добавить фиктивный путь в конце URL-адреса ping (например: http://something:8080/dummy_ping), чтобы вы могли определить, является ли это запросом ping внутри вашего условия if

if (error.status === 0 && !this.isDummyRequest(request)) {
  return this.handleServerDownError(request, next);
}
...
...

private isDummyRequest(request: HttpRequest<any>): boolean {
    if (request.url.includes('/dummy_ping')) {
      return true;
    } else {
      return false;
    }
}

Также, как я могу прекратить итерации в функции карты после обнаружения первого доступного сервера?

Использование функции поиска вместо карты может быть опцией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...