Обработка ошибок в запросе POST в Angular - PullRequest
0 голосов
/ 26 апреля 2020

Я следую руководству по официальной Angular документации по https://angular.io/guide/http. Функция handleError в запросе post имеет 2 аргумента и выдает ошибку «ожидается 1 аргумент, но получено 2».

Код для обработки ошибок:

private handleError(error: HttpErrorResponse) {
  if (error.error instanceof ErrorEvent) {
    // A client-side or network error occurred. Handle it accordingly.
    console.error('An error occurred:', error.error.message);
  } else {
    // The backend returned an unsuccessful response code.
    // The response body may contain clues as to what went wrong,
    console.error(
      `Backend returned code ${error.status}, ` +
      `body was: ${error.error}`);
  }
  // return an observable with a user-facing error message
  return throwError(
    'Something bad happened; please try again later.');
};

Код для запроса на отправку:

/** POST: add a new hero to the database */
addHero (hero: Hero): Observable<Hero> {
  return this.http.post<Hero>(this.heroesUrl, hero, httpOptions)
    .pipe(
      catchError(this.handleError('addHero', hero))
    );
}

Разве функция не нуждается в аргументе в любом случае? Я думаю, что он пытается вызвать функцию снова с аргументом героя в случае ошибки. Это так? Спасибо.

1 Ответ

0 голосов
/ 26 апреля 2020

Руководство angular на самом деле неправильно / сбивает с толку, или, по крайней мере, они не показали правильные примеры. Когда вы делаете что-то вроде этого:

catchError(this.handleError('addHero', hero))

handleError должен принимать два параметра, а также возвращать функцию, которая принимает один параметр. Итак, что-то вроде этого:

handleError<T>(action: string, object: T): (e: HttpErrorResponse) => Observable<never> {
  return (e: HttpErrorResponse) => {
    if (error.error instanceof ErrorEvent) {
      console.error('An error occurred:', error.error.message);
    } else {
      console.error(
        `Backend returned code ${error.status}, ` +
        `body was: ${error.error}`);
    }

    return throwError(
      `Something bad happened while performing action: ${action}, on object ${object}`
    );
  };
}

Если вы хотите, чтобы handleError был похож на тот, который у вас есть:

private handleError(error: HttpErrorResponse) {
  if (error.error instanceof ErrorEvent) {
    console.error('An error occurred:', error.error.message);
  } else {
    console.error(
      `Backend returned code ${error.status}, ` +
      `body was: ${error.error}`);
  }

  return throwError(
    'Something bad happened; please try again later.'
  );
};

Вы должны изменить способ передачи этого в catchError :

catchError((error: HttpErrorResponse) => this.handleError(error));

Если вы не обращаетесь к контексту this из handleError, вы можете сделать следующее:

catchError(this.handleError)

В этой части из руководство, это объясняется лучше. Просто в примерах в разделах POST и PUT отсутствует правильная реализация handleError метода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...