Angular Universal Prerendering with httpClient 用于从 /static/data.json 内容获取数据

Man*_*uel 5 angular-http angular-http-interceptors angular-universal angular angular-httpclient

我只是尝试使用 Angular Universal 预渲染一个组件,该组件使用 httpClient 从/static应用程序本身的文件夹中获取数据。

  1. 如何在 Angular Universal 中正确使用 httpClient?
  2. 是否可以从项目内部访问静态资产并在预渲染时使用 httpClient 获取它们?

我猜该文件不可访问,因为应用程序在预渲染时没有在任何服务器上运行。获取路径是相对的。稍后在远程服务器上获取文件有效,但是在预渲染期间“远程服务器”不可用还是?如何使这工作?

我确实收到了一个错误 [ERROR],这是由httpClient.get(). 捕获错误错误消息为空。

基本上我有服务

doReqeust() = {
  return this.httpClient.get("./static/get.json")
}
Run Code Online (Sandbox Code Playgroud)

并在组件中

onInit() {
  this.data = this.myService.doRequest();
}
Run Code Online (Sandbox Code Playgroud)

并且视图比它通过异步管道绑定

{{ data.response.title | async }}
Run Code Online (Sandbox Code Playgroud)

静态是项目中的静态文件夹。

Dav*_*vid 4

您可以访问assets文件夹中的静态文件

请注意,使用 Angular Universal 时,请求 URL 必须是绝对的。请求 URL 将是执行预渲染的 Web 服务器之一(例如http://localhost:4000

服务.ts

import {Inject, Injectable, Optional, PLATFORM_ID} from '@angular/core';
import {isPlatformBrowser} from "@angular/common";
import {HttpClient} from "@angular/common/http";

constructor(private http: HttpClient, @Inject(PLATFORM_ID) private platformId: Object, 
@Optional() @Inject('serverUrl') protected serverUrl: string)
  {
  }


doRequest()
{
    let baseUrl = isPlatformBrowser(this.platformId)? '' : this.serverUrl;
    return this.http.get(baseUrl + '/assets/static/file.json');
Run Code Online (Sandbox Code Playgroud)

您需要提供serverUrl的值。这应该在您的后端完成。假设你使用的是nodejs

服务器.ts

 extraProviders: [
  //...
  {
    provide: 'serverUrl',
    useValue: `http://localhost:${NODEJS_PORT}`
  },
Run Code Online (Sandbox Code Playgroud)