首页 > 解决方案 > 当 httpClient 失败时,它会在错误回调中返回一个可观察到的错误,而不是一个错误对象

问题描述

使用 Angular 6 的典型 HttpClient 服务,我正在努力将错误输出检索为错误回调中的对象,而不是可观察的。

   ...
    }, (e) => {
       HttpErrorHandling.process(e, this.messageService, this.loggerService, () => {
       this.messageService.send(NotificationMessage['USER_REGISTRATION_TECHNICAL_ERROR'], MessageTypes.error);
       });
     });
   });

当我想检索错误状态时,这不适合我的情况,当我尝试使用 err.status 获取它时,它是未定义的,因为我是在可观察到的

class HttpErrorHandling

 public static process(err: HttpErrorResponse, messageService: MessageService, logger: LoggerService, callback: any) {
    switch(err.status) {
      case HttpStatusCodeEnum.HttpFailure: {
        // Http failure, no internet connection
        this.handleError(err.name, logger, null);
        break;
      }
    ...

相反,如果我像这样订阅可观察到的错误,我确实将错误作为对象检索,但这很混乱并且对性能不利(嵌套订阅)。还有另一种方法可以解决这个问题吗?

     }, (e) => {
    e.subscribe(
          err => HttpErrorHandling.process(err, this.messageService, this.loggerService, () => {
            this.messageService.send(NotificationMessage['USER_REGISTRATION_TECHNICAL_ERROR'], MessageTypes.error);
          })
        });
      });
    });

标签: angularhttprxjs6

解决方案


我可能应该投反对票,我知道没有提供很多代码,我背后的原因是它的公司代码。简而言之,我没有看到有人改变了我们应该如何返回错误,而没有测试背后的含义,因为如果没有明确表达给 QA,谁真正测试了失败的 http 请求。无论如何,有人决定为我在代码中其他地方使用的服务返回错误:

catchError((err) => {
          throw of(err);
        })

我所要做的就是删除 of 方法,然后返回 err 。不知道为什么人们会将错误作为可观察值返回。


推荐阅读