V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
weiceshi
V2EX  ›  Angular

Angular4 里读 cookie 的一个奇怪问题

  •  
  •   weiceshi · 2017-11-06 10:54:27 +08:00 · 3881 次点击
    这是一个创建于 2334 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 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}=`));
        }
    

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

    第 1 条附言  ·  2017-11-06 11:47:37 +08:00
    是我主楼没有写明白
    ```
    if (this.document.cookie) {
    console.log(this.document.cookie.indexOf(`${localcommon.Utils.CookieTokenKey}=`));
    }
    ```
    这样写的话,控制台是可以打印出 cookie 内容的,意思就是判断结果不为空

    但是如果不用 if 判断,就报错
    ```
    console.log(this.document.cookie.indexOf(`${localcommon.Utils.CookieTokenKey}=`));
    ```
    11 条回复    2017-11-06 13:24:41 +08:00
    HuJian201
        1
    HuJian201  
       2017-11-06 11:35:57 +08:00
    this.document.cookie 没有值的时候是 null 吧,当然没有 indexOf
    weiceshi
        2
    weiceshi  
    OP
       2017-11-06 11:41:46 +08:00
    @HuJian201
    为什么判断一下就不为空了呢?
    weiceshi
        3
    weiceshi  
    OP
       2017-11-06 11:42:25 +08:00
    @HuJian201
    我就是不太明白这个问题
    直接 call 就是空
    call 直接用 if 判断一下就不是空了
    jakes
        4
    jakes  
       2017-11-06 11:44:04 +08:00 via iPhone
    因为不为空才进入分支啊。。。
    HuJian201
        5
    HuJian201  
       2017-11-06 11:44:58 +08:00
    @weiceshi 因为 if(null)是 false 下面不执行了呀
    weiceshi
        6
    weiceshi  
    OP
       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
        7
    weiceshi  
    OP
       2017-11-06 11:45:42 +08:00
    @jakes
    @HuJian201

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


    可是本地却是必现,不知道为什么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1490 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 23:52 · PVG 07:52 · LAX 16:52 · JFK 19:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.