【问题标题】:Angular 5 Universal wait for http request to return during server-side renderAngular 5 Universal 在服务器端渲染期间等待 http 请求返回
【发布时间】:2018-06-14 18:21:09
【问题描述】:

我有一个使用 ngExpressEngine 提供的 Angular 5 应用程序(遵循 Angular Universal 入门项目)。我的应用程序有一个组件,它发出 HTTP 请求以获取要显示的一些数据。一切正常,但是当我使用 fetch 作为谷歌机器人时,它返回呈现的页面,但没有任何数据。是否让 ngExpressEngine 服务器在将页面呈现给用户之前等待 HTTP 请求?

【问题讨论】:

标签: angular typescript server-side-rendering angular-universal


【解决方案1】:

您可以在提供程序中使用APP_INITIALIZER 来延迟应用初始化,直到从您的客户端应用模块中获取您的 api,例如:

//app.module.ts
        providers: [{provide: APP_INITIALIZER, deps: [HttpClient], multi: true,
    useFactory: (http: HttpClient: Promise) => new Promise<Your Data Interface>((resolve, reject) => http.get("").pipe(map(data => {
     //do something with data
resolve(data)
    }), catchError(error => of(error).pipe(map(() => //do something if error)))))}]

【讨论】:

    【解决方案2】:

    我不了解 Angular 5,但是使用最新的 Angular 版本(我写这篇文章时是 7.2),我可以确认通过 Resolve 加载的所有数据都在服务器端正确呈现,而且通过ngOnInit钩子加载的所有数据,即使它是异步的。

    这要归功于 Zone.js,事实上,它会跟踪所有异步操作并在异步任务队列为空时发出 onMicrotaskEmpty 事件,让 Angular 知道页面已准备好呈现。供参考:what is the use of Zone.js in Angular 2

    【讨论】:

      猜你喜欢
      • 2021-06-12
      • 2017-08-02
      • 2017-04-27
      • 2021-06-11
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 2017-11-22
      相关资源
      最近更新 更多