【问题标题】:How to return response object for bad request from Angular service to component如何将错误请求的响应对象从 Angular 服务返回到组件
【发布时间】:2019-10-02 16:26:53
【问题描述】:

API 返回以下类型的响应 -

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 返回成功 (200, 201),我可以获取 ResponseObject 类型的值,但如果是错误请求 (404, 400),它不会返回任何 ResponseObject 值。它以 handleError() 方法结束。

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

【问题讨论】:

  • 为什么不在订阅函数中移动你的错误处理代码呢?喜欢err =&gt; this._moovApiService.handleError(err)

标签: angular express angular-services


【解决方案1】:

我会把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
)

【讨论】:

  • 谢谢!我已经像这样映射了我的错误响应 - this.response = err.error
【解决方案2】:

如果您希望所有 HTTP 状态代码都被视为数据而不是错误,您需要从您的 handleError 返回一个 false Observable。示例:

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

【讨论】:

    【解决方案3】:

    订阅前捕获错误。

    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);
                });
        }
    

    【讨论】:

    • catchError((error: HttpErrorResponse) =&gt; { let errorMessage = ''; if (error.error instanceof ErrorEvent) { // client-side error errorMessage = 'Error: ${error.error.message}'; } else { // server-side error errorMessage = 'Error Code: ${error.status}\nMessage: ${error.message}'; } window.alert(errorMessage); return throwError(errorMessage); })
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2019-08-31
    • 2017-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多