繁体   English   中英

Angular Universal不渲染路线

[英]Angular Universal not rendering route

我遇到了Angular Universal的问题,虽然所有指南都不同(官方的指南似乎已经过时了)我已经设法运行带有服务器端渲染的node.js服务器。
还有一个我无法解决的巨大问题,因为我实际上并不知道发生了什么

这是app.module.ts

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        HttpClientModule,
        BrowserModule.withServerTransition({
            appId: 'ta-un-certificate'
        }),
        RouterModule.forRoot([{
            path: '', loadChildren: './page/page.module#PageModule'
        }], {
            enableTracing: false,
            useHash: false
        }),
        TranslateModule.forRoot({
            loader: {
                provide: TranslateLoader,
                useFactory: HttpLoaderFactory,
                deps: [HttpClient]
            }
        })
    ],
    providers: [
        SeoService,
        DataService, {
            provide: HTTP_INTERCEPTORS,
            useClass: HttpErrorInterceptor,
            multi: true
        }],
    bootstrap: [
        AppComponent
    ]
})

它只是加载另一个模块, PageModule及其组件和东西

@NgModule({
    imports: [
        CommonModule,
        TranslateModule,
        RouterModule.forChild([{
            path: ':name/:id', component: PageComponent
        }, {
            path: '', pathMatch: 'full', component: RedirectComponent
        }])
    ],
    declarations: [
        RedirectComponent,
        PageComponent,
        BannerComponent,
        BodyComponent,
        FooterComponent
    ]
})
export class PageModule {
}

对于服务器部分,我创建了另一个模块app.server.module.ts ,它是node.js使用的模块

@NgModule({
    imports: [
        AppModule,
        ServerModule,
        ModuleMapLoaderModule,
        ServerTransferStateModule
    ],
    providers: [
        SeoService
    ],
    bootstrap: [AppComponent],
})
export class AppServerModule {
}

问题是,如果我尝试从node.js服务器调用路由,例如。 http://localhost:4000/foo/bar ,node.js服务器控制台打印出一个巨大的错误,从这开始:

Error: Uncaught (in promise): ReferenceError: navigator is not defined
[...]

(它真的很大,如果你需要的东西请问一下)并且页面不会被渲染,因为从cURL我只得到html里面的<app-root><router-outlet></router-outlet></app-root>身体。

我想我已经检查过这么多指南,我已经完全失去了正确的方法,但克隆Angular Universal Starter似乎正在做我期待的Universal

搜索已编译的server.js脚本,由节点执行的脚本,似乎在Translator中有一个错误。 所以我专注于搜索html渲染和Translation管道之间的问题,但后来我在服务中找到了一个navigator.language.split (app不是由我构建的)。 isPlatformServer块中移动该控件解决了我的问题。

这是代码的重要部分

private _language = navigator.language.split('-')[0];

constructor(private _http: HttpClient) {
}

我编辑如下

private _language;

constructor(@Inject(PLATFORM_ID) private platformId,
            private _http: HttpClient) {

    if (isPlatformServer(this.platformId)) {
        this._language = 'en';
    } else {
        this._language = navigator.language.split('-')[0];
    }
}

修复了这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM