我正在使用通用角度(SSR)开发角度应用程序。
出现问题的原因是具有防护的路由(在这种情况下为canLoad或canActivate)无法启动应用程序,没有响应,并且由nginx导致“网关超时”结束。
不包含防护的路由会完美启动应用程序。
知道为什么会这样吗?
app.routes.ts
@NgModule({
imports: [RouterModule.forRoot([
{
path: 'administracion',
canLoad: [IsAdminGuard],
loadChildren: 'app/module-admin/admin.module#AdminModule'
},
{
path: '',
loadChildren: 'app/module-page/page.module#PageModule'
}
], {
useHash: false,
preloadingStrategy: PreloadAllModules,
initialNavigation: 'enabled'
})],
exports: [RouterModule],
providers: [IsAdminGuard]
})
app.server.module.ts
@NgModule({
imports: [RouterModule.forRoot([
{
path: 'administracion',
loadChildren: 'app/module-admin/admin.module#AdminModule',
canLoad: [IsAdminGuard]
},
{
path: '',
loadChildren: 'app/module-page/page.module#PageModule'
}
], {
useHash: false,
preloadingStrategy: PreloadAllModules,
initialNavigation: 'enabled'
})],
exports: [RouterModule],
providers: [IsAdminGuard]
})
app.browser.module.ts
@NgModule({
bootstrap: [AppComponent],
imports: [
BrowserModule.withServerTransition({appId: 'frontend'}),
AppModule,
]
})
is-admin.guard.ts
constructor(
@Inject(PLATFORM_ID) private platformId: Object,
private _userService: UserService,
private router: Router
) {}
canLoad(): Promise<boolean> {
if (isPlatformBrowser(this.platformId)) {
return new Promise<boolean>((resolve, reject) => {
this._userService.isAdmin().toPromise().then(
(response) => {
if (response) {
resolve(true);
} else {
this.router.navigate(['/']);
resolve(false);
}
},
(error) => {
this.router.navigate(['/']);
resolve(false);
}
);
});
}
}
答案 0 :(得分:0)
古老的问题,但是那些可能碰到这个问题的人。在升级旧项目(不存在该问题的地方)时,我们需要在后卫中调用的函数,如果平台不是浏览器,则返回String[] inputValues = { "123", "RAJ" };
String[] inputColumns = { "ID", "NAME" };
fieldSet = fieldSetFactory.create(inputValues, inputColumns);
:
null
然后使用canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
let url: string = state.url;
return this.checkLogin(url);
}
checkLogin(url: string) {
if (this.authService.hasValidToken()) {
return true;
}
if (this.authService.hasValidToken() === false) {
// do stuff
}
this.router.navigate(['']);
return false;
}
函数:
hasValidToken()