Angular“Http 失败响应...0 未知错误”问题再次出现

dan*_*l8x 12 rxjs typescript angular angular-httpclient

我在 stackoverflow 上阅读了很多有关此问题的主题。大多数答案都说这是 CORS 问题。我不确定我的情况,所以这就是为什么我再次问这个问题并在这里需要认真的帮助。

我正在开发一个 Angular 应用程序,它在 Android 平板电脑网络浏览器上每 60 秒调用一次 API。该应用程序运行得非常好。但几个小时后,我开始看到错误:

0-Http failure response for https://theurl.com/api/: 0 Unknown Error
Run Code Online (Sandbox Code Playgroud)

可怕的是它是随机发生的,有时会在 8,9 或 10 小时后发生,有时会在一天后发生,这对我来说很难调试。但如果我重新加载应用程序,它就会恢复正常工作。当然,我不想每次发生这种情况都这样做,而且我无法弄清楚解决它的根本问题是什么。

我正在考虑在拦截器中添加一个逻辑。每当我收到错误状态:0 时,然后重新加载应用程序。但我不确定这是好的做法..

任何建议都将非常感激,或者至少可以解决。谢谢。

// 编辑:当错误状态为 0 时,我将在重试 5 次后忽略:

 intercept(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<
    | HttpSentEvent
    | HttpHeaderResponse
    | HttpProgressEvent
    | HttpResponse<any>
    | HttpUserEvent<any>
    | any
  > {
 return next.handle(request).pipe(
        catchError(err => {
          if (err instanceof HttpErrorResponse) {
            switch (err.status) {
              case 401:
                return this.handle401Error(request, next);
              case 0:
                return this.handleUnknownError(request, next);
              default:
                return this.router.navigate(['system-error']);
            }
          } else {
            return throwError(err);
          }
        })
      );
    }
   }

     private handleUnknownError(request: HttpRequest<any>, next: HttpHandler) {
        return next.handle(request).pipe(
          retryWhen(errors => {
            return errors.pipe(delay(2000), take(5));
          })
        );
      }
Run Code Online (Sandbox Code Playgroud)

小智 1

情况0是由于您的出站请求未出发而引起的。这可能是因为 CORS 或某些安全策略阻止了您的请求离开,因为服务工作线程拦截并未能处理请求,或者因为设备的互联网连接失败或被暂停。

我在自己的许多项目中都看到过这种行为,并发现这是因为设备进入待机状态或为了省电而暂停了自己的连接。您可以通过启用并观察来自可观察的 HTTP ProgressEvents(互联网连接失败)来测试设备上的互联网连接是否存在问题:

这些错误的状态设置为 0,并且错误属性包含 ProgressEvent 对象,其类型可能提供更多信息。 https://angular.io/guide/http#getting-error-details

我不知道这是否一定能回答您的问题,但我希望它为您提供了额外的调查途径。我很想听听是否有帮助。