【问题标题】:Server-side rendering (SSR) with Angular Universal使用 Angular Universal 的服务器端渲染 (SSR)
【发布时间】:2021-11-01 14:54:00
【问题描述】:

为了创建服务器端应用程序模块,我使用了这个命令

ng add @nguniversal/express-engine

然后,我运行了命令: npm run build:ssr ,构建成功。

之后我跑了 npm run serve:ssr,但出现以下错误

*****************-u:~/practice-angular$ npm run serve:ssr

> practice-angular@0.0.0 serve:ssr /home/bhavya/practice-angular
> node dist/practice-angular/server/main.js

/home/bhavya/practice-angular/dist/practice-angular/server/main.js:364478
        redirectTo: localStorage.getItem('countryCode') || 'my'
                    ^

ReferenceError: localStorage is not defined
    at Object../src/app/app-routing.module.ts (/home/bhavya/practice-angular/dist/practice-angular/server/main.js:364478:21)
    at __webpack_require__ (/home/bhavya/practice-angular/dist/practice-angular/server/main.js:20:30)
    at Object../src/app/app.module.ts (/home/bhavya/practice-angular/dist/practice-angular/server/main.js:364599:30)
    at __webpack_require__ (/home/bhavya/practice-angular/dist/practice-angular/server/main.js:20:30)
    at Object../src/app/app.server.module.ts (/home/bhavya/practice-angular/dist/practice-angular/server/main.js:364718:22)
    at __webpack_require__ (/home/bhavya/practice-angular/dist/practice-angular/server/main.js:20:30)
    at Object../src/main.server.ts (/home/bhavya/practice-angular/dist/practice-angular/server/main.js:388159:27)
    at __webpack_require__ (/home/bhavya/practice-angular/dist/practice-angular/server/main.js:20:30)
    at Object../server.ts (/home/bhavya/practice-angular/dist/practice-angular/server/main.js:364353:23)
    at __webpack_require__ (/home/bhavya/practice-angular/dist/practice-angular/server/main.js:20:30)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! practice-angular@0.0.0 serve:ssr: `node dist/practice-angular/server/main.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the practice-angular@0.0.0 serve:ssr script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/bhavya/.npm/_logs/2021-09-03T08_32_02_929Z-debug.log

为了解决这个错误,我按照answer 中提到的步骤进行操作。但是,我仍然无法解决这个问题。谁能帮我解决这个问题?

【问题讨论】:

    标签: angular angular-seo


    【解决方案1】:

    当您的代码在服务器端执行时,您在浏览器中拥有的一些 API,如 localStoragesessionStorage 不可用。一个解决方案是注入 PLATFORM_ID 并使用 isPlatformBrowser 函数来访问此 API,前提是您仅在浏览器环境中。

    import { Component, OnInit, Inject } from '@angular/core';
    import { PLATFORM_ID } from '@angular/core';
    import { isPlatformBrowser} from '@angular/common';
    
    @Component({
      selector: 'your-component',
      templateUrl: 'your-component.component.html',
      styleUrls: ['your-component.component.css'],
    })
    export class YourComponent implements OnInit { 
      constructor(@Inject(PLATFORM_ID) private _platformId: Object) {}
    
      ngOnInit() {  
        if (isPlatformBrowser(this._platformId)) {
          // here you can access localStorage
        } else {
          // here you are on the server side and localStorage is not available
        }
      }
    }
    

    有一种方法可以在服务器端获取 localStorage,例如使用node-localstorage,但是您将在服务器上拥有一个localStorage,在浏览器中拥有一个,如果您想共享数据,您必须找到同步它们的方法。

    【讨论】:

    • 感谢您的回答。在我的项目中,我有几个组件及其 .component.ts 文件。在每个 ts 文件中都有 localStorage.get()localStorege.set() 方法。那么我是否必须在所有这些 .ts 文件中包含上述方法?
    • 甚至在一些 service.ts 文件中,return 语句也是这样的return localStorage.getItem('token')。我是否也必须在 service.ts 文件中包含 isPlatformBrowser ?
    • 是的,您必须在使用存储的任何地方都这样做。
    • 感谢您的回复 ;-) 还有一个问题,我怎样才能在app-routingmodule.ts 中包含上述代码?
    • 我在 app-routing.module.ts 中有一行喜欢 -> redirectTo: localStorage.getItem('code') || 'xy'。我应该如何修改这个本地存储使用?你能帮我解决这个问题吗
    猜你喜欢
    • 2017-04-27
    • 2017-11-22
    • 2021-06-11
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 2018-09-23
    • 1970-01-01
    相关资源
    最近更新 更多