未定义localStorage(Angular Universal)

Hongbo Miao

我正在使用通用启动器作为骨干。

当我的客户端启动时,它从localStorage读取有关用户信息的令牌。

@Injectable()
export class UserService {
  foo() {}

  bar() {}

  loadCurrentUser() {
    const token = localStorage.getItem('token');

    // do other things
  };
}

一切正常,但是由于服务器渲染,我在服务器端(终端)得到了这一点

例外:ReferenceError:未定义localStorage

我从ng-conf-2016-universal-patterns中得到了使用依赖注入解决此问题的想法但是那个演示真的很老。

说我现在有两个文件:

main.broswer.ts

export function ngApp() {
  return bootstrap(App, [
    // ...

    UserService
  ]);
}

main.node.ts

export function ngApp(req, res) {
  const config: ExpressEngineConfig = {
    // ...
    providers: [
      // ...
      UserService
    ]
  };

  res.render('index', config);
}

现在,他们使用相同的UserService。有人可以给出一些代码来解释如何使用不同的依赖注入来解决这个问题吗?

如果有比依赖注入更好的方法,那也很酷。


更新1我正在使用Angular 2 RC4,我尝试了@Martin的方法。但是即使我导入了它,它仍然在下面的终端中给我错误:

终端(npm启动)

/my-project/node_modules/@angular/core/src/di/reflective_provider.js:240抛出新的reflective_exceptions_1.NoAnnotationError(typeOrFunc,params); ^错误:无法解析'UserService'(Http,?)的所有参数。确保所有参数都用Inject修饰或具有有效的类型注释,并且'UserService'用Injectable修饰。

终端(npm run watch)

错误TS2304:找不到名称“ LocalStorage”。

我想它在某种程度上与LocalStoragefrom angular2-universal(虽然我没有使用import { LocalStorage } from 'angular2-universal';重复,但是即使我尝试将我的更改为LocalStorage2,仍然无法正常工作。

同时,我的IDE WebStorm也显示红色:

在此处输入图片说明

顺便说一句,我找到了import { LocalStorage } from 'angular2-universal';,但不确定如何使用它。


更新2,我更改为(不确定是否有更好的方法):

import { Injectable, Inject } from '@angular/core';
import { Http } from '@angular/http';
import { LocalStorage } from '../../local-storage';

@Injectable()
export class UserService {
  constructor (
    private _http: Http,
    @Inject(LocalStorage) private localStorage) {}  // <- this line is new

  loadCurrentUser() {
    const token = this.localStorage.getItem('token'); // here I change from `localStorage` to `this.localStorage`

    // …
  };
}

这解决了UPADAT 1中的问题,但是现在终端出现错误:

例外:TypeError:this.localStorage.getItem不是一个函数

马丁

更新以获取较新版本的Angular

OpaqueTokenInjectionToken具有相同功能的方式所取代-除了它具有InjectionToken<T>用于更好地进行类型检查和推断的通用接口之外

原始答案

两件事情:

  1. 您没有注入任何包含localStorage对象的对象,而是试图以全局方式直接访问它。任何全局访问都应该是出现问题的第一个线索。
  2. nodejs中没有window.localStorage。

您需要做的是为localStorage注入一个适配器,该适配器将同时适用于浏览器和NodeJS。这也将为您提供可测试的代码。

在local-storage.ts中:

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

export const LocalStorage = new OpaqueToken('localStorage');

在您的main.browser.ts中,我们将从您的浏览器注入实际的localStorage对象:

import {LocalStorage} from './local-storage.ts';

export function ngApp() {
  return bootstrap(App, [
    // ...

    UserService,
    { provide: LocalStorage, useValue: window.localStorage}
  ]);

然后在main.node.ts中,我们将使用一个空对象:

... 
providers: [
    // ...
    UserService,
    {provide: LocalStorage, useValue: {getItem() {} }}
]
...

然后,您的服务会注入以下内容:

import { LocalStorage } from '../local-storage';

export class UserService {

    constructor(@Inject(LocalStorage) private localStorage: LocalStorage) {}

    loadCurrentUser() {

        const token = this.localStorage.getItem('token');
        ...
    };
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

错误$在Angular Universal中未定义

来自分类Dev

Angular Universal + Webpack 4:ReferenceError:窗口未定义

来自分类Dev

Angular Universal npm run serve:ssr返回“未定义文档”

来自分类Dev

Visual Studio 2015 RC Cordova应用程序(Windows Phone Universal,“警报”未定义)

来自分类Dev

在Angular中的localStorage.getItem上未定义

来自分类Dev

angular2 服务中未定义 LocalStorage

来自分类Dev

Angular 2 Universal Heroku部署

来自分类Dev

排除破坏Angular Universal的组件

来自分类Dev

Angular 2 Universal Heroku部署

来自分类Dev

为什么 Angular Universal 是必要的?

来自分类Dev

angularjs $ localStorage未定义,但已定义

来自分类Dev

在localStorage之后对象属性未定义

来自分类Dev

Redux测试-ReferenceError:未定义localStorage

来自分类Dev

localStorage获取未定义状态

来自分类Dev

在localStorage之后对象属性未定义

来自分类Dev

Flux(Alt):ReferenceError:未定义localStorage

来自分类Dev

JavaScript无法从localStorage捕获未定义

来自分类Dev

Angular Universal仅显示首页的页面源

来自分类Dev

Angular Universal SSR CSS动画转换错误

来自分类Dev

Angular Universal在订阅中添加元标记

来自分类Dev

this.debug不是Angular Universal的函数

来自分类Dev

检查Angular Universal渲染的组件的宽度

来自分类Dev

使用 Angular Universal 进行 Ngx-translate

来自分类Dev

使用 Angular Universal 导入外部 html

来自分类Dev

Angular Universal 5 - 元服务不工作

来自分类Dev

在 Github 页面上部署 Angular Universal?

来自分类Dev

Angular Universal 不使用新代码重建

来自分类Dev

静态NextJS站点中的localStorage:ReferenceError:未定义localStorage

来自分类Dev

无法读取未定义的传递LocalStorage值的属性以查看组件Angular 7

Related 相关文章

  1. 1

    错误$在Angular Universal中未定义

  2. 2

    Angular Universal + Webpack 4:ReferenceError:窗口未定义

  3. 3

    Angular Universal npm run serve:ssr返回“未定义文档”

  4. 4

    Visual Studio 2015 RC Cordova应用程序(Windows Phone Universal,“警报”未定义)

  5. 5

    在Angular中的localStorage.getItem上未定义

  6. 6

    angular2 服务中未定义 LocalStorage

  7. 7

    Angular 2 Universal Heroku部署

  8. 8

    排除破坏Angular Universal的组件

  9. 9

    Angular 2 Universal Heroku部署

  10. 10

    为什么 Angular Universal 是必要的?

  11. 11

    angularjs $ localStorage未定义,但已定义

  12. 12

    在localStorage之后对象属性未定义

  13. 13

    Redux测试-ReferenceError:未定义localStorage

  14. 14

    localStorage获取未定义状态

  15. 15

    在localStorage之后对象属性未定义

  16. 16

    Flux(Alt):ReferenceError:未定义localStorage

  17. 17

    JavaScript无法从localStorage捕获未定义

  18. 18

    Angular Universal仅显示首页的页面源

  19. 19

    Angular Universal SSR CSS动画转换错误

  20. 20

    Angular Universal在订阅中添加元标记

  21. 21

    this.debug不是Angular Universal的函数

  22. 22

    检查Angular Universal渲染的组件的宽度

  23. 23

    使用 Angular Universal 进行 Ngx-translate

  24. 24

    使用 Angular Universal 导入外部 html

  25. 25

    Angular Universal 5 - 元服务不工作

  26. 26

    在 Github 页面上部署 Angular Universal?

  27. 27

    Angular Universal 不使用新代码重建

  28. 28

    静态NextJS站点中的localStorage:ReferenceError:未定义localStorage

  29. 29

    无法读取未定义的传递LocalStorage值的属性以查看组件Angular 7

热门标签

归档