问题描述
问题出在 Angular Universal,如果我在没有 Universal 的情况下构建应用程序它工作正常,但使用 Angular Universal 这就是问题所在。
我在 ngrx 和 Angular Universal 中使用 angular,在每次重新加载时,我都会向后端发送请求,然后检索用户数据。如果路由在重新加载时受到身份验证保护保护,如果用户首先登录,它会重定向到 /login,然后在 0.5 秒后重定向到受保护的路由,数据已加载,一切正常,但为什么它首先显示 /login ?
授权保护
canActivate(
route: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
return this.store.select(fromAuth.selectAuthState).pipe(
map(authState => authState.isInitializing),filter((isInit) => !isInit),tap((data) => console.log(data)),switchMap(() => {
return this.store.select(fromAuth.selectAuthState).pipe(
map(authState => authState),map((isAuth) => {
console.log(isAuth);
if (isAuth.user) return true;
return this.router.createUrlTree(['/login'],{ queryParams: { returnUrl: state.url } });
}),take(1)
);
})
);
Ngrx/store 中的初始状态
export const initialState: State = {
isAuthenticated: false,isInitializing: true
登录成功和登录失败 isInitializing 设置为 false
on(AuthActions.logInSuccess,(state) => {
return {
isInitializing: false,isAuthenticated: true,};
}),
我正在 APP_INITIALIZER 中调度 isLoggedIn 操作
export function appInitializerFactory(
store: Store<any>
) {
return () => {
store.dispatch(AuthActions.isLoggedIn());
};
}
providers: [
{
provide: APP_INITIALIZER,useFactory: appInitializerFactory,deps: [Store],multi: true
}
]
内部验证效果
isLoggedIn$ = createEffect(() =>
this.actions$.pipe(
ofType(AuthActions.isLoggedIn),switchMap(() => {
return this.authService.isLoggedIn().pipe(
switchMap((user: any) => {
return [
AuthActions.logInSuccess({ token: user.token,name: user.data.user.name,email: user.data.user.email,id: user.data.user._id,likedProperties: [...user.data.user.likedPropertiesSell,...user.data.user.likedPropertiesRent],myProfileinformations: userProfile })]
}),catchError(err => {
return of(AuthActions.logInFail({ error: `code ${err.status}` }))
}
)
);
})
)
);
来自 Auth Guard 的控制台日志
2020-12-24T14:01:53.070535+00:00 app[web.1]: isAuthenticated: false,2020-12-24T14:01:53.070535+00:00 app[web.1]: user: null,2020-12-24T14:01:53.070536+00:00 app[web.1]: errorMessage: 'code undefined',2020-12-24T14:01:53.070537+00:00 app[web.1]: likedProperties: null,2020-12-24T14:01:53.070537+00:00 app[web.1]: following: null,2020-12-24T14:01:53.070538+00:00 app[web.1]: followingListLoaded: false,2020-12-24T14:01:53.070538+00:00 app[web.1]: myProfileinformations: null,2020-12-24T14:01:53.070539+00:00 app[web.1]: isInitializing: false
2020-12-24T14:01:53.070539+00:00 app[web.1]: }
所以 store 在检索用户数据之前将 isInitializing 设置为 false,我真的不知道为什么 errorMessage 存在那里,在 redux store logInFail() 永远不会被调度
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)