2

在后端,我创建了一个很好的异常机制,所以当请求失败时。服务器将向客户端发送一条带有一些错误代码的漂亮错误消息。

像这样:

@Getter
public class ErrorResponse {

    /**
     * Http Response status code
     */
    private final HttpStatus status;

    /**
     * General Error Message
     */
    private final String message;

    private final ErrorCode errorCode;

    private final Date timeStamp;
...
}

我想默认为每次失败向用户显示错误消息。

我试图扩展HttpClient

public get<T>(endPoint: string, options?: IRequestOptions): Observable<T> {
    return this.http.get<T>(this.API + endPoint, options);
  }

但它返回一个Observable

在大部分页面中,我都在做这样的事情:

this.client.post(WebUtils.RESOURCE_HOST + '/api' + '/actor/create', formData
    ).subscribe(
      () => this.onSuccessfulPost(),
      error => {
        this.snack.error(error.error.message);
      }
    );

在很多页面中,我都在写同样的东西:

error => {
            this.snack.error(error.error.message);
          }

我读了这篇关于扩展 HttpClient 的文章。
但这对我来说还不够,它只是定义一个default "API_HOST"我想为请求方法返回对象定义默认错误函数,它们是 Observables。

有没有像扩展一样操作“HttpClient请求方法”的返回对象?

4

3 回答 3

3

您可以使用为此而设计的新HTTPClient 拦截器

这是一个示例:

export class ErrorHandlerService implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next
      .handle(req)
      .catch((err: HttpErrorResponse) => {
          console.log('error');
          // Mandatory return statement
          return Observable.throw(err);
        }
      );
  }

}

在 Angular 执行的每个 HTTP 请求中,都会运行这个拦截器,并且会按照你告诉它的方式运行。在这种情况下,它会记录错误,但你可以让他做任何你想做的事。

于 2018-07-26T12:25:12.370 回答
1

我个人为集中错误处理所做的工作如下:

在我的服务中,我使用 catchError 拦截 http 请求,例如

return this.httpClient .get(...) .pipe( catchError(this.handleError.bind(this) );

错误处理(在我的例子中,记录依赖于 HTTP 返回状态和返回值)在 handleError 方法中完成,如下所示:

`

private handleError(error: any) {
    error = error || {};
    if (error.status == 401 || error == 401 || error == 'Unauthorized') {
      ...
      this.logout();
    } else if (error.status == 403 || error == 403 || error == 'Forbidden') {
      ...
    } else if ((error.status == 423 || error == 423) && error._body) {
      ...
    } else if (error.status == 500) {
      ...
    } else {
      return this.processUnknownError(error);
    }
    return _throw(error);
  }

`

我还声明了一个全局 noop 函数

export function noop() {}

这样我所有的服务消费者只调用

this.dataService.getFoo().subscribe((values) => { ... }, noop);

也许那个尝试也适合你?

于 2018-07-26T12:19:36.247 回答
1

感谢 tricheriche,如果您想使用“HttpClient”进行集中式异常处理,这是我的最终代码:

1)创建一个拦截器:

import {Injectable} from '@angular/core';
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';
import {Observable} from 'rxjs';
import {catchError} from 'rxjs/operators';
import {throwError} from 'rxjs';
import {SnackService} from '../services/snack.service';

@Injectable({
  providedIn: 'root'
})
export class HttpErrorHandlerService implements HttpInterceptor {

  constructor(private snack: SnackService) {
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req)
      .pipe(catchError(err => {
          this.snack.error(err.error.message);
          return throwError(err);
        }
      ));
  }

}

Snack 是我通知用户的定制小吃店。

2)提供你的拦截器:

const HTTP_INTERCEPTOR_PROVIDERS = [
  {provide: HTTP_INTERCEPTORS, useClass: HttpErrorHandlerService, multi: true }
];

将此添加到您的项目模块中,它可以是“ app.module.ts”: providers: [HTTP_INTERCEPTOR_PROVIDERS]

就这样。现在,如果发生任何错误,您可以在拦截器中处理它。

而且我的请求代码块没有任何错误功能。

由此:

 this.httpClient.post('http://localhost:8080/api/auth/login', loginModel, httpOptions)
      .subscribe(
        result => {
          this.createToken(result);
        },
        (error) => {
          this.parseError(error);
        }
      );

对此:

 this.httpClient.post('http://localhost:8080/api/auth/login', loginModel, httpOptions)
      .subscribe(
        result => {
          this.createToken(result);
        }
      );

没有更多的错误功能,这就是我想要的。

于 2018-08-01T14:49:18.947 回答