Angular 角路由器保护中的NgRx呼叫调度操作将执行无限循环
故事: 大家好。我是一个使用NgRx库的新手。在我的angular项目中,我使用路由器防护来防止未经验证的用户访问未经验证的网站 我的理想是调用RESTAPI来验证本地存储令牌内容。当rest api结果为“success”时,在返回(true)之前执行“store.dispatch(loginsucess)”更新存储中的登录验证信息 问题: 什么时候做派遣行动。“登录成功”操作始终执行无限循环,即使在@Effect()中设置{dispatch:false}。在尝试和谷歌搜索解决方案后。这个问题一直存在于我的项目中。 希望stackoverflow上的一些朋友能给我一些帮助。~谢谢 部分代码: auth.guard.tsAngular 角路由器保护中的NgRx呼叫调度操作将执行无限循环,angular,typescript,redux,ngrx,Angular,Typescript,Redux,Ngrx,故事: 大家好。我是一个使用NgRx库的新手。在我的angular项目中,我使用路由器防护来防止未经验证的用户访问未经验证的网站 我的理想是调用RESTAPI来验证本地存储令牌内容。当rest api结果为“success”时,在返回(true)之前执行“store.dispatch(loginsucess)”更新存储中的登录验证信息 问题: 什么时候做派遣行动。“登录成功”操作始终执行无限循环,即使在@Effect()中设置{dispatch:false}。在尝试和谷歌搜索解决方案后。这个问题
。。。。。
....
激活(
下一步: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导航会影响代码。问题将得到解决,无需删除“返回代码”。