Ошибка Catch не вызывается, когда я выкидываю ошибку в angular 8 - PullRequest
0 голосов
/ 03 мая 2020

Я добавил перехватчик HTTP, чтобы перехватить все возможные ошибки в запросе, а затем выбросить эту ошибку, используя throwError

    constructor(private accountService: AccountService) { }

    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // add authorization header with jwt token if available
        const currentuser = this.accountService.isLoggedIn;
        const token = localStorage.getItem('jwt');
        if (currentuser && token !== undefined) {
            request = request.clone({
                setHeaders:
                {
                    Authorization: `Bearer ${token}`

                }
            });
            request = request.clone({ headers: request.headers.set('Content-Type', 'application/json') });

            request = request.clone({ headers: request.headers.set('Accept', 'application/json') });
        }

        return next.handle(request).pipe(
            catchError(error => {
                debugger
                if (error instanceof HttpErrorResponse) {

                    const unothorizedError = error;

                    if (unothorizedError.status === 401) {
                        if (unothorizedError.error != null) {
                            return throwError(unothorizedError.error);
                        }
                    }

                    if (unothorizedError.status === 0) {
                        return throwError('Connection failed to the server');
                      }

                    const applicationError = error.headers.get('Application-Error');

                    if (applicationError) {
                        return throwError(applicationError);
                    }

                    const serverError = error.error;
                    let modalStateErrors = '';

                    if (serverError && serverError.errors && typeof serverError.errors === 'object') {
                        for (const key in serverError.errors) {
                            if (serverError.errors[key]) {
                                modalStateErrors += serverError.errors[key] + '\n';
                            }
                        }
                    }
                    return throwError(modalStateErrors || serverError || 'Server Error');
                }
            })
        );
    }

И я пытаюсь перехватить ошибку от моего преобразователя, но когда я отлаживал, я обратите внимание, что ошибка catch не вызывается

    resolve(route: ActivatedRouteSnapshot): Observable<Product[]> {
    debugger
    return this.productsService
      .getAllProducts(this.pageNumber, this.pageSize, null)
      .pipe(
        catchError(error => {
          console.log(error);
          // this.snackBar.open('Problem retriving your data', 'cancel', {
          //   duration: 5000 ,
          // });
          // this.router.navigate(['/home']);
          return of(null);
        })
      );}

А затем выдается TypeError: You provided 'undefined' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable..

Так что, похоже, я не могу отловить ошибку, полученную от моего перехватчика.

1 Ответ

0 голосов
/ 03 мая 2020

Я вижу этот вопрос здесь ссылка , и я добавил

else {return throwError(error);}

в перехватчик HTTP, и он работает, но я не знаю, почему

...