Angular HTTP请求可观察到的错误不捕获错误?

Mic*_*elB 4 observable rxjs angular angular-httpclient

Angular 6使用HttpClient。目前尚未实施拦截器。

我有一个管理服务,正在对MSGraph进行http调用。在这种情况下,我收到一个错误400错误的请求,该请求正在发送到通知处理程序。

我在该console.log中滑动以确保该错误块完全被触发,在另一个cnosole.log中滑动以查看从服务器取回的“数据”是否为错误。

没有console.logs触发,但是全局错误处理程序仍在控制台中显示400错误的请求响应。

我希望能够使用此回复并显示一条用户友好的消息。

码:

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

Cob*_*ger 5

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));
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用pipe调用catchError,它可以正确处理服务器错误。

要使用catchError,您需要先将其导入,如下所示:

import { catchError } from 'rxjs/operators';
Run Code Online (Sandbox Code Playgroud)

  • 这是行不通的。BadRequest 响应仍然会在浏览器中引发异常,但从未命中代码。 (3认同)
  • @SebastianG请参阅更新的答案。 (2认同)
  • @SebastianG当您要花费时间时,请更进一步,将`HttpClient`包装到您自己的服务中。它确实使这种事情变得更简单,并为您提供了更多选择。例如,我的实际代码还包括对“ GET”的自动重试以及关于成功或失败的可视通知。 (2认同)
  • 抱歉,没有。我的服务基本上具有相同的“获取”,“发布”等功能,但是增加了对“ catchError”和“重试”的“管道”调用(仅适用于“获取”)。它还调用通知服务,该服务与您的服务相似。关键是它为您提供了选择,并且您可以随意扩展。我也有某些重载,可以自动将单个对象放置在数组中,依此类推。您可能还可以使用拦截器来完成很多工作,但是我总是会包装它。 (2认同)
  • 啊哈 那是一个简单的`.pipe(retry(2))`,在我的`catchError`的`pipe`之前添加。因此,它最多进行三次尝试,然后才返回错误。retry是从与catchError相同的模块导入的。 (2认同)