【问题标题】:Angular how to use HttpClient in custom ErrorHandler?Angular如何在自定义ErrorHandler中使用HttpClient?
【发布时间】:2020-04-10 13:50:02
【问题描述】:

我想在我的自定义错误处理程序中调用我的 REST API,以便在调用处理程序时向我自己发送电子邮件。

我曾尝试使用注射器,但出现此错误:

Error: Cannot instantiate cyclic dependency! HttpClient

在这里你可以看到我的错误处理程序:

import { Router } from '@angular/router';
import { ErrorHandler, Injector, Injectable, NgZone } from '@angular/core';
import { ToastrService } from 'ngx-toastr';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class AppErrorHandler extends ErrorHandler {

  constructor(private injector: Injector) {
    super();
  }

  private get toastrService(): ToastrService {
    return this.injector.get(ToastrService);
  }

  private get http(): HttpClient {
    return this.injector.get(HttpClient);
  }

  private get router(): Router {
    return this.injector.get(Router);
  }

  private get ngZone(): NgZone {
    return this.injector.get(NgZone);
  }

  public handleError(error: any): void {
    if (error.status === 401) {
      this.ngZone.run(() => this.router.navigate(['/home']));
      this.toastrService.error('Login first', 'Error');
    } else if (error.status === 403) {
      this.ngZone.run(() => this.router.navigate(['/home']));
      this.toastrService.error('unauthorize', 'Error');
    } else {
      this.http.post<any>('/api/error-mailer', error).subscribe(() => { });
      this.toastrService.error('Something went wrong', 'Error', { onActivateTick: true });

    }

    super.handleError(error);
  }
}

我也可能有错误的方法,所以如果你能帮助我,那就太好了!

【问题讨论】:

    标签: angular angular-httpclient angular-errorhandler


    【解决方案1】:

    您应该使用http interceptor 处理httpClient 错误。在拦截器中,您可以注入您需要的服务。但是,您应该注意从拦截器调用 http 请求,因为它会通过拦截器运行,并且当您的错误邮件程序关闭时,您最终可能会出现循环。

    【讨论】:

    • 感谢您的回答。我将 401 和 403 移到了 http 拦截器中。我仍然想为所有打字稿错误发送一封电子邮件(以防万一)。我还在订阅中添加了错误处理,因此不会有任何循环。
    猜你喜欢
    • 2017-10-20
    • 2017-10-21
    • 2014-04-11
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多