Как вернуть объект ответа на неверный запрос из сервиса Angular в компонент - PullRequest
0 голосов
/ 02 октября 2019

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

Я могу получить значения для типа ResponseObjectесли API возвращает успех (200, 201), но если это неверный запрос (404, 400), он не возвращает никаких значений для ResponseObject. Это заканчивается в методе handleError ().

Я хочу получить ответ для всех кодов состояния в моем компоненте и затем обработать его. Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Ошибка перехвата перед подпиской.

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);
            });
    }
0 голосов
/ 02 октября 2019

Я бы поставил 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
)
...