Ошибка обработки с помощью rxjs, несовместимого с перехватчиками - PullRequest
0 голосов
/ 13 марта 2019

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

Все мои услуги выглядят так:

public getSomething(): Observable<Something> {
    return this.http
        .get<Something>(url)
        .pipe(
            map(res => res.data),
            catchError((e): Observable<any> => of(e))
        );
}

Если мой токен аутентификации недействителен / истек, служба перехватывает ошибку. Я могу позвонить прямо сейчас.

Однако, если у меня много услуг, мне придется повторять этот процесс много раз. Поэтому мне нужно настроить перехватчик или пользовательский обработчик ошибок.

Оба не запускаются, если я сохраняю catchError в сервисах.

Если я решу остаться СУХИМ, мне нужно удалить catchError. Если я удаляю catchError, rxjs становится практически бесполезным (завершение, повторение и т. Д.)

Если я решу оставить catchError, мне нужно изменить их все, чтобы они вызывали какую-то глобальную функцию обработки ошибок, чтобы она оставалась СУХОЙ. Но тогда я не использую Angular, как должен.

Как мне справиться с этой ситуацией?

РЕДАКТИРОВАТЬ: https://stackblitz.com/edit/angular-m2jc9n

Там активен ErrorHandler, перехватчик комментируется в app.module. Если вы удалите catchError из службы, сработает ErrorHandler, в противном случае catchError будет иметь приоритет.

1 Ответ

1 голос
/ 13 марта 2019

Если вы хотите иметь общий перехватчик, у вас есть HTTP_INTERCEPTOR :

в вашем module.ts

@NgModule({
  declarations: [
   ...
  ],
  imports: [
   ...
  ],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: LoginInterceptor,
      multi: true
    }
  ]
})

И услуга LoginInterceptor:

@Injectable()
export class LoginInterceptor implements HttpInterceptor {

  constructor() {
  }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    return next.handle(request).pipe(
      tap(() => {
        }, (err: any) => {
          if (err instanceof HttpErrorResponse) {
            // DO here what you want
            // this.router.navigate(['login']);
          }
        }
      )
    );
  }
}

Альтернативой будет использование охранника в верхней части маршрута.

...