Angular4 里读 cookie 的一个奇怪问题

2017-11-06 10:54:27 +08:00
 weiceshi

在 NavigationStart 的时候读 cookie
下面这样是可以的

import { DOCUMENT } from '@angular/common';
export class AppComponent {
    constructor(
        private router: Router,
        @Inject(DOCUMENT) private document: any) {
        router.events.subscribe(event => {
            if (event instanceof NavigationStart) {
                this.onNavigationStart(event);
            }
        });
    }

    async onNavigationStart(event: NavigationStart) {
        if (this.document.cookie) {
            console.log(this.document.cookie.indexOf(`${localcommon.Utils.CookieTokenKey}=`));
        }
    }
}

但是如果没有判断,就会报错 TypeError: Cannot read property 'indexOf' of undefined

 async onNavigationStart(event: NavigationStart) {
        console.log(this.document.cookie.indexOf(`${localcommon.Utils.CookieTokenKey}=`));
    }

请教一下这是什么原因呢?

3911 次点击
所在节点    Angular
11 条回复
HuJian201
2017-11-06 11:35:57 +08:00
this.document.cookie 没有值的时候是 null 吧,当然没有 indexOf
weiceshi
2017-11-06 11:41:46 +08:00
@HuJian201
为什么判断一下就不为空了呢?
weiceshi
2017-11-06 11:42:25 +08:00
@HuJian201
我就是不太明白这个问题
直接 call 就是空
call 直接用 if 判断一下就不是空了
jakes
2017-11-06 11:44:04 +08:00
因为不为空才进入分支啊。。。
HuJian201
2017-11-06 11:44:58 +08:00
@weiceshi 因为 if(null)是 false 下面不执行了呀
weiceshi
2017-11-06 11:45:11 +08:00
@HuJian201
嗯,可能是我主楼没有写明白
if (this.document.cookie) {
console.log(this.document.cookie.indexOf(`${localcommon.Utils.CookieTokenKey}=`));
}
这样写的话,控制台是可以打印出 cookie 内容的,意思就是判断结果不为空

但是如果不用 if 判断,就报错
console.log(this.document.cookie.indexOf(`${localcommon.Utils.CookieTokenKey}=`));
weiceshi
2017-11-06 11:45:42 +08:00
@jakes
@HuJian201

嗯,是我主楼没有写明白,判断结果是不为空,并且成功打印出了内容
HuJian201
2017-11-06 11:58:36 +08:00
@weiceshi console.log(typeof this.document.cookie);不加 if 打印出类型看看就知道了。
nannanziyu
2017-11-06 12:02:55 +08:00
@HuJian201
string
HuJian201
2017-11-06 12:38:58 +08:00
@nannanziyu 要不放一个在线 demo 看看?
weiceshi
2017-11-06 13:24:41 +08:00
@HuJian201
我用 stackblitz 建了一个,重现不了,哎
https://stackblitz.com/edit/angular4-2thuqn


可是本地却是必现,不知道为什么

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/403854

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX