错误:未捕获(承诺):authGuard中的[对象对象]

时间:2019-07-17 02:08:33

标签: angular typescript

我正在我的应用程序上实现authGuard。但是我总是出错。

这是我的警卫

canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
    /**
     * returning an observable of type boolean is the correct way
     * to handle can activate that needs to wait for an observable result.
     */
    // 1. Select the authConfig from the store
    return this.getAuthentication()
      .pipe(
        // 2. Take the first instance.
        take(1),
        // 3. map the observable to an observable of type boolean
        // !! turns the value into a booleanca
        map((auth: AuthConfig) => !!(auth && auth.success === true)),
        // 4. if not authenticated then redirect the user.
        tap((auth: boolean) => this.redirectUserIfUnauthenticated(auth, this.getRedirectUrl(route))),
        // catch any errors and handle them.
        catchError((...args) => this.handleError.apply(this, args))
      )
  }

这是我的getAuthentication

private getAuthentication(): Observable<AuthConfig> {
    return zip(
      this.store.select(ngrxTypes.authConfig),
      this.store.select(ngrxTypes.optionsConfig)
    ).pipe(
      mergeMap((configurations: [AuthConfig, OptionsConfig]) => this.getAuthenticationStatus(configurations)),
      mergeMap((authConfig: AuthConfig) => this.setAuthenticationStatus(authConfig))
    );
  }

这是我执行http get方法的地方

private getAuthenticationStatus([auth, config]: [AuthConfig, OptionsConfig]): Observable<AuthConfig> {
    if (auth) {
      return this.store.select(ngrxTypes.authConfig);
    } else {
      const token = this.storageService.getCookie('token');
      const apiUrl = `${environment.user_profile_domain_url || config.user_profile_domain_url}/widgets/api/auth`;
      if (config && token) {
        return this.http.get(apiUrl, this.storageService.getHeader('Bearer', token))
          .map(login => login.json())
      } else {
        this.store.dispatch(this.authActions.setAuthConfig({success: false}));
        return this.store.select(ngrxTypes.authConfig);
      }
    }
  }

在执行过程时,我一直会遇到此错误。我不知道为什么每次都会发生这种情况。

enter image description here

1 个答案:

答案 0 :(得分:0)

对于Promises的工作方式或内部错误的处理方式似乎是一种误解。

在提供的示例代码中,当您收到响应(401错误)时,您正在“捕获”处理程序中处理该响应,但是当满足 if 条件时(您收到401错误) ),您抛出另一个错误未被处理,因为此后没有其他捕获处理程序。因此,在仍未解决的承诺中未处理错误。

您似乎想抛出错误(当接收到401时),该错误由调用使您获得http的函数的代码捕获,但是您将错误抛出于promise内,使得promise由于以下原因而失败未处理的错误。