【问题标题】:How to pass variable from Express.js to Angular11 universal SSR如何将变量从 Express.js 传递到 Angular11 通用 SSR
【发布时间】:2021-02-12 21:01:13
【问题描述】:

快速提问,我们如何从 expressjs 传递到 angular-universal HTML 组件或主应用程序 index.html 变量,例如从 expressjs 到 ejs 或 pug 可用?

        app.get('*', (req, res) => {
          res.render('index', { req, messsage: 'This is your message' });
        }

Ejs 可以像这样从 expressjs 中获取变量:

    <h1><%= message %></h1>

Pug 可以像这样从 expressjs 中获取变量:

 h1= message

当页面加载或重新加载到 view-source 中而不是在 shadow dom 或 DOM 中或在 chrome 上“检查”时,我们需要显示来自 expressjs 的消息.必须在呈现 HTML 源文件的 view-source 上。

我们使用 angular 11 SSR 通用和 expressjs。

有什么想法或者是不可能的吗?

【问题讨论】:

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


    【解决方案1】:

    您可以从服务器提供值并在您的组件/服务中使用它们

    server.ts

    app.get('*', (req, res) => {
          res.render('index', { req, res,  providers: [{ provide: 'message', useValue: 'This is your message' }] })
    

    component.ts

    import {Injectable, Inject, PLATFORM_ID, Optional} from '@angular/core';
    import {isPlatformBrowser} from "@angular/common";
    import {TransferState, makeStateKey} from '@angular/platform-browser';
    
    //Message here is optional because it is only provided in SSR mode
    
    constructor(@Inject(PLATFORM_ID) private platformId: Object,
    @Optional() @Inject('message') public message: string,
     private readonly transferState: TransferState)
    {         
        const storeKey = makeStateKey<string>('messageKey');
        if(isPlatformBrowser(this.platformId))//get message from transferState if browser side
        {
            this.message = this.transferState.get(storeKey, 'defaultMessageValue');
        }
        else //server side: get provided message and store in in transfer state
        {
            this.transferState.set(storeKey, this.message);
        }
        
        
        
    

    component.html

    <div *ngIf="message">Message from server : {{message}} </div>
    

    使用该代码,您的消息将出现在服务器呈现的 html 中(您可以使用查看源代码查看)。

    由于传输状态,消息也可以在客户端获得

    编辑我添加了说明,以便消息在客户端仍然可用

    【讨论】:

    • 那么我们如何将值保留在客户端,因为被覆盖了?作为未定义。我需要在这两个区域保留消息
    • 然后就可以添加到传输状态了
    • @jcdsr 我添加了额外的说明,因为你显然被卡住了
    • 实际上,我被卡住了,谢谢。在变量 const storeKey 上是 makeStateKey 而不是 makeCacheKey?
    • 我也得到了,错误:src/app/app.component.html:23:13 - 错误 TS2445:属性“消息”受保护,只能在“AppComponent”类及​​其子类。
    猜你喜欢
    • 2016-03-25
    • 2020-08-26
    • 2017-10-23
    • 2011-04-02
    • 2016-02-16
    • 2010-11-02
    • 2021-12-30
    • 2015-02-03
    • 2018-09-10
    相关资源
    最近更新 更多