gpt4 book ai didi

Angular,错误拦截器,在不同的 url 上重试原始请求

转载 作者:太空狗 更新时间:2023-10-29 18:35:25 24 4
gpt4 key购买 nike

我几个月前开始在一个新项目中使用 Angular,但现在我需要编写一个更复杂的错误拦截器,它将检测后端 API 何时关闭。

拦截器需要检测 HTTP 错误代码,如果服务器关闭,我需要向第三方 API 服务器执行请求并获取可用后端服务器 URL 的列表,从该列表中 ping 每个服务器直到一个找到 UP 并重试原始请求(主要是更改基本 URL)。

以下是拦截器需要执行的步骤:

  1. 查看错误码,如果为0则调用问题处理方法
  2. 执行对不同 API 的请求并获取所有可用服务器的列表
  3. 遍历列表并 ping 该列表中的每个服务器。
  4. 找到可用服务器后,重试原始请求。

在我的例子中,通常的请求是获取项目列表:

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

缺少基本 URL,因为我使用另一个拦截器动态添加它。

获取可用后端服务器 URL 列表的方法:

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

以及可以ping通服务的服务

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 方法当然会返回相同的错误代码。

有什么想法让它发挥作用吗?也许我可以更改 ping 方法返回不同的代码?

另外,在找到第一个可用服务器后,如何停止在 map 函数中进行迭代?

提前致谢!

最佳答案

I almost got i working but of course that the ping method returns the same error code if the pinged server is down and I receive the same error code and I enter in an endless loop.

为此,您可以在 ping url 的末尾添加一个虚拟路径(例如:http://something:8080/dummy_ping),以便您可以确定它是否是 if 条件中的 ping 请求

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;
}
}

Also how can I stop iterating in a map function after the first available server is found?

可以选择使用查找函数而不是 map

关于Angular,错误拦截器,在不同的 url 上重试原始请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55969435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com