Я начал работать с Angular несколько месяцев назад над новым проектом, но теперь мне нужно написать более сложный перехватчик ошибок, который будет определять, когда внутренний API не работает.
Перехватчик должен обнаруживатьHTTP-код ошибки и, если сервер не работает, мне нужно выполнить запрос к стороннему API-серверу и получить список доступных URL-адресов внутреннего сервера, пропинговать каждый сервер из этого списка, пока не будет найден один UP, и повторить исходный запрос.(в основном для изменения базового URL).
Вот шаги, которые должен сделать перехватчик:
- проверить код ошибки, если код равен 0, вызвать метод для обработкипроблема
- выполнить запрос к другому API и получить список всех доступных серверов
- Выполнить итерацию по списку и пропинговать каждый сервер из этого списка.
- Когда доступносерверы найдены, повторите исходный запрос.
В моем случае обычным запросом будет получение списка проектов:
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, возвращающий другой код?
Также, как я могу прекратить итерации в функции карты после того, как найден первый доступный сервер?
Заранее спасибо!