【问题标题】:Angular Universal sessionStorage is not definedAngular Universal sessionStorage 未定义
【发布时间】:2018-12-11 23:35:39
【问题描述】:

我已将我的应用程序从 Angular 6 移动到 Angular Universal,并且在这样做之后,我在控制台中注意到了这个错误:

sessionStorage 未定义

它正在抱怨这项服务:

export class SessionService {
  constructor(
    private key: string
  ) { 
  }

  save(json: any) {
    sessionStorage.setItem(this.key, JSON.stringify(json));
  }

  get() {
    return JSON.parse(sessionStorage.getItem(this.key));
  }

  clear() {
    sessionStorage.clear();
  }
}

我看到你可以这样做:

 if (!isPlatformBrowser(this.platformId)) return;

但是这个服务实际上是这样扩展的:

import { Injectable } from '@angular/core';

import { SessionService } from './session.service';

@Injectable({
  providedIn: 'root'
})
export class QuestionSessionService extends SessionService {
  constructor() {
    super(
      'questions'
    );
  }
}

所以我不能将@Inject(PLATFORM_ID) private platformId: Object 添加到构造函数中。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您是否尝试在父服务中注入PLATFORM_ID
  • 我不认为我可以这样做,因为它会使所有其他服务(扩展它)需要额外的构造函数参数

标签: angular angular-universal


【解决方案1】:

在你的 sessionService 中添加检查你是否在浏览器端

if (!isPlatformBrowser(this.platformId));

如果你在浏览器端做你现在正在做的事情。但如果您在 SR 端,请使用 memoryStorage 或任何其他不会导致此错误的不可操作的虚拟注册。

希望对你有帮助。

【讨论】:

  • 我不能那样做,我已经说过,因为服务是注入的,所以我不能向构造函数添加任何东西,因为它会与扩展基类的所有服务相混淆...... ..
  • 您不能考虑只为 SR 更改任何其他层上的 sessionStorage 吗?所以它不会在 SR 方面为空?
猜你喜欢
  • 2020-08-05
  • 2016-12-29
  • 1970-01-01
  • 2020-11-12
  • 2018-09-25
  • 1970-01-01
  • 2020-02-15
  • 2020-05-28
  • 2021-03-19
相关资源
最近更新 更多