如何 return 从 Angular 服务到组件的错误请求的响应对象

How to return response object for bad request from Angular service to component

API return 低于响应类型 -

export class ResponseObject{
statusCode: Number;
statusMessage: string;
response: string;
}

服务 -

 singIn(user: User): Observable<ResponseObject>{
    return this._httpClient.post<ResponseObject>(`${this._svcURL}/users/signin`, user, this._httpOptions)
    .pipe(catchError(this.handleError));    
  }

  private handleError(errResponse: HttpErrorResponse){
    if(errResponse.error instanceof ErrorEvent){
      console.log("[Service] Client side error-",errResponse.error.message);
    }
    else{
      console.log("[Service]", errResponse);
    }
    return throwError("Oops! There is an issue with service. We're working on it.");
  }

组件 -

loginUser(signinForm: any): void{
    let user: User = {
      email: signinForm.email,
      password: signinForm.password
    };
    console.log('[LOGIN-COMPONENT] User details ', user);

    this._moovApiService.singIn(user)
      .subscribe((response: ResponseObject) => this.responseObject = response,
      err => {
        console.log('[LOGIN-COMPONENT] ', err);
      },
      () => {
        console.log('[LOGIN-COMPONENT] Response from service ', this.responseObject);
      }
    );
  }

如果 API return 成功 (200, 201),我可以获取 ResponseObject 类型的值,但如果是错误请求 (404, 400),则不会return ResponseObject 的任何值。它以 handleError() 方法结束。

我想获得组件中所有状态代码的响应,然后对其进行处理。我该怎么做?

如果您希望所有 HTTP 状态代码都被视为数据而不是错误,您需要 return 来自您的 handleError 的错误 Observable。示例:

private handleError(errResponse: HttpErrorResponse){
    return Observable.of(false);
}

我会把 handleError() 写成 public 然后做

this._moovApiService.singIn(user).subscribe(
  (data) => this.response = data,
  (err) => {
    this._moovApiService.handleError(err)
    this.response = // put any value you want here
  },
  //() => complete
)

订阅前捕获错误。

loginUser(signinForm: any): void {
        let user: User = {
            email: signinForm.email,
            password: signinForm.password
        };

        console.log('[LOGIN-COMPONENT] User details ', user);

        this._moovApiService.singIn(user).pipe(catchError(err => {
                console.log('[LOGIN-COMPONENT] ', err);
            }))
            .subscribe((response: ResponseObject) => {
                this.responseObject = response;
                console.log('[LOGIN-COMPONENT] Response from service ', this.responseObject);
            });
    }