我正在我的应用程序上实现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);
}
}
}
在执行过程时,我一直会遇到此错误。我不知道为什么每次都会发生这种情况。
答案 0 :(得分:0)
对于Promises的工作方式或内部错误的处理方式似乎是一种误解。
在提供的示例代码中,当您收到响应(401错误)时,您正在“捕获”处理程序中处理该响应,但是当满足 if 条件时(您收到401错误) ),您抛出另一个错误未被处理,因为此后没有其他捕获处理程序。因此,在仍未解决的承诺中未处理错误。
您似乎想抛出错误(当接收到401时),该错误由调用使您获得http的函数的代码捕获,但是您将错误抛出于promise内,使得promise由于以下原因而失败未处理的错误。