无法实现用于捕获 Angular 中的 http 错误的方法装饰器?

Not able to implement method decorators for catching http errors in Angular?

实际上我想使用自定义装饰器捕获所有 http 请求的错误。

我的实际代码如下所示:

  createRecord(data: data) {
    
    return this.httpClient.post(`${this.apiURL}/record/`, data);
  }

我想将这些函数转换成这样:

 createRecord(data: data) {
        
        return this.httpClient.post(`${this.apiURL}/record/`, data)
               .pipe(tap((data)=>console.log(data)),catchError(handleError)));
      }

我知道这可以使用 http 拦截器,但我尝试使用自定义方法装饰器。 我的装饰器看起来像这样:

export function CatchHttpError() : MethodDecorator {
    return function ( target : any, propertyKey : string, descriptor : PropertyDescriptor ) {
      const original = descriptor.value;
      descriptor.value = original()
      .pipe(
        tap((data)=>console.log('tap entered: data = ',data)),
        catchError(handleError)
      );
      return descriptor;
    };
  }

然后我像这样装饰函数:

 @CatchHttpError()
  createRecord(data: data) {
    
    return this.httpClient.post(`${this.apiURL}/record/`, data);
  }

但这里的问题是它仅在我初始化此特定服务时才尝试执行函数,而不是在我实际调用 createRecord 方法时。如何修改方法装饰器来实现这个结果?

如果您希望装饰器改变它所应用的方法的行为,您需要从装饰器中覆盖原始方法:

export function CatchHttpError() : MethodDecorator {
    return function (target : any, propertyKey : string, descriptor : PropertyDescriptor ) {
      const original = descriptor.value;
      // override the method
      descriptor.value = function(...args: any[]) {
            // Calling the original method
            const originalResults = original.apply(this, args);
            return originalReults.pipe(
                tap((data) => console.log('tap entered: data = ',data)),
                catchError(handleError)
            );
      }
}

请注意,重要的是使用 function 关键字而不是箭头函数来定义覆盖,以便能够使用 class 上下文的 this