带防护的路由在服务器端渲染中不起作用

时间:2019-04-18 18:35:19

标签: angular typescript

我正在使用通用角度(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);
                }
            );
        });
    }
}

1 个答案:

答案 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()