Ошибка при использовании rx js - операторы труб и отводов - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть следующий блок кода, который должен создать запись в БД.

createRole(role: RoleCreateModel): Observable<RoleCreateModel> {
    if (role) {
      return this.http
      .post<RoleCreateModel>(`${this.roleUrl}roles`, JSON.stringify(role), constants.httpOptions)
        .pipe(
          tap(_ => this.apiHelper.notify('Role successfully created!', 'SUCCESS')),
          catchError(this.apiHelper.handleError('Method: createRole', 'FAIL'))
        );
    }
}

Вышеуказанный метод вызывается следующим методом:

const subscription: Subscription = this.rolesService.createRole(newRoleData).subscribe(res => {
     subscription.unsubscribe();
});

При ошибке происходит из-за какого-то бизнес-правила в бэкэнде, возвращается код состояния HTTP 500, который, по-видимому, неправильно обрабатывается первым способом, описанным выше.

core.js:6014 ERROR TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
    at subscribeTo (subscribeTo.js:40)
    at subscribeToResult (subscribeToResult.js:7)
    at CatchSubscriber.error (catchError.js:38)
    at TapSubscriber._error (tap.js:56)
    at TapSubscriber.error (Subscriber.js:55)
    at MapSubscriber._error (Subscriber.js:75)
    at MapSubscriber.error (Subscriber.js:55)
    at FilterSubscriber._error (Subscriber.js:75)
    at FilterSubscriber.error (Subscriber.js:55)
    at MergeMapSubscriber.notifyError (OuterSubscriber.js:7)

Какой должен быть правильный подход для решения этой проблемы?

1 Ответ

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

Ваша handleError функция должна возвращать Observable чего-либо. Например, это может выглядеть так:

function handleError(funcionName: string, method: string) {
  return function errorHandler(res: HttpErrorResponse) {
    this.logger.error(res);
    let eMsg: string = '';
    if (res.error.message) {
      eMsg = res.error.message;
    } else {
      eMsg = res.message || '';
    }
    const error = Error in ${funcionName} ${eMsg ? ': ' + eMsg : ''};
    this.notify(error, 'FAIL');
    return of(eMsg);
  }.bind(this);
} 
...