Angular 角路由器保护中的NgRx呼叫调度操作将执行无限循环

Angular 角路由器保护中的NgRx呼叫调度操作将执行无限循环,angular,typescript,redux,ngrx,Angular,Typescript,Redux,Ngrx,故事: 大家好。我是一个使用NgRx库的新手。在我的angular项目中,我使用路由器防护来防止未经验证的用户访问未经验证的网站 我的理想是调用RESTAPI来验证本地存储令牌内容。当rest api结果为“success”时,在返回(true)之前执行“store.dispatch(loginsucess)”更新存储中的登录验证信息 问题: 什么时候做派遣行动。“登录成功”操作始终执行无限循环,即使在@Effect()中设置{dispatch:false}。在尝试和谷歌搜索解决方案后。这个问题

故事:

大家好。我是一个使用NgRx库的新手。在我的angular项目中,我使用路由器防护来防止未经验证的用户访问未经验证的网站

我的理想是调用RESTAPI来验证本地存储令牌内容。当rest api结果为“success”时,在返回(true)之前执行“store.dispatch(loginsucess)”更新存储中的登录验证信息

问题:

什么时候做派遣行动。“登录成功”操作始终执行无限循环,即使在@Effect()中设置{dispatch:false}。在尝试和谷歌搜索解决方案后。这个问题一直存在于我的项目中。 希望stackoverflow上的一些朋友能给我一些帮助。~谢谢

部分代码:

auth.guard.ts

。。。。。
....
激活(
下一步:ActivatedRouteSnapshot,
状态:RouterStateSnashot):可观察的|承诺|布尔| UrlTree{
const authData:{email:string,token:string}=JSON.parse(
字符串(localStorage.getItem('User'));
const authToken=authData&&authData.token;
//loginServ是用于验证令牌的REST API
返回此.loginServ.VerifyToken(authToken).pipe(
concatMap((res:AuthResult)=>{
如果(res.result==='success'){
this.store.dispatch(登录成功({
我证实:是的,
电子邮件:authData&&authData.email,
令牌:authToken,
结果:"成功",,
信息:“成功”
}));  //  {
console.log(state);//this.actions$
.烟斗(
ofType(登录成功),
地图((用户:任意)=>{
console.log(用户);
const beStoreInfo={
电子邮件:user.email,
令牌:user.token,
};
localStorage.setItem(
“用户”,
stringify(beStoreInfo));
返回{
类型:“[auth]登录成功”,
我证实:是的,
电子邮件:user.email,
令牌:user.token,
结果:user.result,
message:user.message
};
}),
),{调度:false});
....
...
服务概述-routing.module.ts

。。。。
//使用延迟加载模块
常数路由:路由=[
{
路径:“”,
canActivate:[AuthGuard],
组件:ServiceOverviewComponent},
];
@NGD模块({
导入:[RouterModule.forChild(路由)],
导出:[路由模块]
})
导出类ServiceOverviewRoutingModule{}
....
app-routing.module.ts

使用延迟加载模块。

。。。。
...
常数路由:路由=[
{path:'login',loadChildren:()=>import('./login/login.module')
.然后(m=>m.LoginModule)},
{path:'register',loadChildren:()=>import('./register/register.module')
.then(m=>m.RegisterModule)},
{path:'service_overview',loadChildren:()=>import('./service overview/service overview.module')
.then(m=>m.ServiceOverviewModule)},
{路径:'',重定向到:'login',路径匹配:'full'}
];
....
环境:

角度Cli:8.0.3

NgRx存储/效果:8.0.1

操作系统:Ubuntu 18.04


…谢谢

您的登录成功效果将返回另一个登录成功操作,导致无限循环

loginSuccess = createEffect(() => this.actions$
  .pipe(
    ofType(LoginSuccess),
    map((user: any) => {

      console.log(user);
      const beStoreInfo = {
        email: user.email,
        token: user.token,
      };

      localStorage.setItem(
        'User',
        JSON.stringify(beStoreInfo));
        // remove this ⬇
        return {
          type: '[auth] Login Success',
          isAuthenticated: true,
          email: user.email,
          token: user.token,
          result: user.result,
          message: user.message
        };
        // end remove this ⬆
    }),
  ), {dispatch: false});

请包括您的路由配置。谢谢@Reactgular。更新我的路由模块代码:删除返回代码后,无限循环始终存在。我自己找到解决方案。当我在NgRx影响中使用“router.navigate”时会出现此问题。它将通过“auth.guard”触发无限循环。当我删除路由器时。从NgRx导航会影响代码。问题将得到解决,无需删除“返回代码”。