使用angular-cli在Universal Rendering中使用cookie
我使用angular-cli创建了一个角度应用程序,并通过执行
here给出的步骤在其中进行通用渲染.但有人提到,如果我正在进行通用渲染,我不能在我的应用程序中使用全局变量,如窗口和文档,如何在前端设置cookie以维护用户会话.以前我使用JWT,但为此我需要在浏览器中设置cookie.
解决方法
注意:以下所有信息仅在您使用Node with Express动态呈现(在请求命中服务器时)服务器上的Angular应用程序时才有效.我没有考虑过预渲染.我不知道如果你使用Express以外的框架,你会怎么做,比如Hapi或其他任何orher框架.我只能猜测@nguniversal也应该为那些人提供解决方案,但是没有考虑过.
话虽这么说,这就是我设法在我的应用程序中提供cookie的方式,当它呈现在服务器端时: app.server.module.ts: // ... import { Request } from 'express'; import { REQUEST } from '@nguniversal/express-engine/tokens'; @Injectable() export class RequestCookies { constructor(@Inject(REQUEST) private request: Request) {} get cookies() { return !!this.request.headers.cookie ? this.request.headers.cookie : null; } } @NgModule({ imports: [ // ... ],providers: [ CookieService,{ provide: 'req',useClass: RequestCookies } ],bootstrap: [AppComponent] }) export class AppServerModule {} app.module.ts :(有些人可能称之为app.browser.module.ts) @NgModule({ declarations: [ // ... ],imports: [ // ... ],{ provide: 'req',useValue: null } ],bootstrap: [AppComponent] }) export class AppModule {} cookie.service.ts: import { Inject,Injectable } from '@angular/core'; @Injectable() export class CookieService { private cookieStore = {}; constructor( @Inject('req') private readonly req: any,) { if (this.req !== null) { this.parseCookies(this.req.cookies); } else { this.parseCookies(document.cookie); } } public parseCookies(cookies) { this.cookieStore = {}; if (!!cookies === false) { return; } let cookiesArr = cookies.split(';'); for (const cookie of cookiesArr) { const cookieArr = cookie.split('='); this.cookieStore[cookieArr[0]] = cookieArr[1]; } } get(key: string) { return !!this.cookieStore[key] ? this.cookieStore[key] : null; } } any.component.ts: // ... constructor( private cookieService: CookieService ) {} needMyCookie() { const userCookie = this.cookieService.get('user'); } 确保你> npm install express @ nguniversal / express-engine 附:我开始看这个回购:https://github.com/angular/universal-starter/tree/master/cli用于服务器端渲染,只做了自己的cookie部分(不包括在那里).
但是,如果您尝试使用我发布的链接,您会发现服务器上的延迟加载模块也是RENDERED!我不知道密钥是什么,也许它与server.js文件中的代码和@nguniversal / module-map-ngfactory-loader有关. 我尝试过: 这是我在浏览器中禁用javascript时得到的: 我的旋转木马项目间距是这样的,因为它们实际上缩放到90%.我在onInit上的项目上有一个zoomIn动画.在服务器渲染视图上,我将它们强制设置为90%,这样它们在第一次加载时就不会出现100%,然后在客户端启动后,将它们设置为90到100的动画. 此外,如果有人遇到这个答案,并注意到屏幕截图中的视口宽度的引用,在主导航链接下面的代码块中 – 如果他们想知道 – 这是我的WindowService: import { Injectable,PLATFORM_ID,Inject } from '@angular/core'; import { isPlatformBrowser,isPlatformServer } from '@angular/common'; @Injectable() export class WindowService { constructor( @Inject(PLATFORM_ID) private readonly platformId: any,) {} get width() { if (isPlatformBrowser(this.platformId)) { return window.innerWidth; } else { return 'Not available server-side!'; // return null; } } } 只需将它添加到app.module.ts和app.server.module.ts中的providers:[]数组即可. 这里需要注意的另一件事是我正在使用Node with Express.如果您正在使用其他框架,例如Hapi或其他任何框架,我不知道这样做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 什么是推荐的方式来扩展AngularJS控制器?
- 解决Invalid white space character (0x …… 文
- scala – 用于嵌套集合的zipWithIndex(没有可变状
- Angular 2 – 在@HostListener(‘blur’)的自定义
- Scala:尽管在添加时使用了Long,但仍会溢出
- twitter-bootstrap – 如何在bootstrap 3中清除带
- bash – 获取变量的名称作为输入,并使用该名称更
- Bootstrap3.0学习第二轮(栅格系统原理)
- 在Docker和Kubernetes上运行MongoDB微服务
- twitter-bootstrap – 我如何使用AngularJS ng-r