Угловой пользовательский обработчик ошибок не всегда срабатывает после ошибок - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть приложение, в котором я использую ngXS, перехватчик аутентификации и глобальный обработчик ошибок.У меня есть действие входа в систему и другое действие, где я получаю некоторые сущности с сервера.Auth перехватчик работает нормально, но я хочу использовать обработчик ошибок в случае каждой ошибки, конечно.В перехватчике ошибки отлавливаются и генерируются, но ошибка действия get не отображается в обработчике глобальных ошибок, а при входе в систему - HttpErrorResponse ...

Код:

get(): Observable<any> {
    return this.httpClient.get(`${this.backendUrl}get`, this.httpOptions);
}

login(email: string, password: string) {
    const param = JSON.stringify({email: email, password: password });
    return this.http.post(`${this.backendUrl}login`, param, this.httpOptions);
}

AuthState:

@Action(Login)
login({ patchState }: StateContext<AuthStateModel>, { payload }: Login) {
    return this.authService.login(payload.userName, payload.password)
      .pipe(tap((result: { jwtBearerToken: string, email: string, expiresIn: number, userId: number }) => {
        patchState({ token: result.jwtBearerToken, userName: result.email, expiresIn: result.expiresIn, userId: result.userId });
        this.store.dispatch(new Navigate(['/list']));
      }))
}

ThingsState:

@Action(Fetch)
getThings({ getState, setState }: StateContext<ThingsStateModel>) {
    const state = getState();

    this.service.get().subscribe(getResult => {
        setState({
        ...state,
        things: getResult
        });
    });
}

AuthInterceptor:

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private store: Store) {}

intercept(req: HttpRequest<any>,
          next: HttpHandler): Observable<HttpEvent<any>> {
    const token = this.store.selectSnapshot(AuthState.token);
    let request: HttpRequest<any> = req;

    if (token) {
        request = req.clone({
            headers: req.headers.set("Authorization",
                "Bearer " + token)
        });
    }

    return next.handle(request)
        .pipe(catchError((error, caught) => {
            // !!  this throw is executed in both cases !!
            throw error;
            return of(error);
        }) as any);
    }
}

Глобальный обработчик ошибок:

@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
constructor(private injector: Injector) { }

    handleError(error: Error) {
    //  this is hit only in the case of errors during the Login action...
    }
}

Есть идеи, что попробовать?Спасибо!

1 Ответ

0 голосов
/ 12 июня 2019

Я не уверен, что это просто опечатка.

В вашей функции get () вы используете "this.httpClient".Но в вашей функции login () вы используете "this.http".

Также в вашем ThingsState вы можете добавить catchError () и отправить другое действие, например, так.

@Action(Fetch)
getThings({ getState, setState }: StateContext<ThingsStateModel>) {
    const state = getState();

    this.service.get()
    .pipe(
      map(result => {
        setState({...state, things: result})
      }),
      catchError(() => dispatch(resetThings()))
    );
}

@Action(ResetThings)
resetThings({patchState}: StateContext<ThingsStateModel>) {
  // Reset your model or handle the error
}
...