记一个坑爹的夜晚。。。坑爹的console不仅是IE,还有你们喜欢的chrome

        最近在检查修改一个nodejs的项目的时候,突然好奇地去mongohub里面看了一下session的存储,想着形象一点地看看session的增加、修改过程。


        于是乎拿起chrome就开始测试,习惯性打开F12,监控本地cookie并对cookie进行清空,然后在mongo的监控器里面看sessionid,来了两下ctrl+r就发现不对劲了,监控器里面的sessionid在一直不断的增加啊。然后就是狂按刷新,监视器显示session疯狂增加。 这时候心中第一个念头就是:“我擦,肯定出bug了!” 


        回头进程序里面疯狂找虫,重写关于session部分的内容、更换了一套操作session的中间件、甚至跑去github上一行一行看这个middleware的源码啊你妹。。。。各种地方都检查过了,总没有发现问题,心想这种情况要是出现在线上项目,要是有个变态在session过期时间内疯狂刷新,数据库里面就不断新增session,总有一个时候被撑爆。带着疑惑不断的google,中文、英文甚至日语都去搜了一遍,完全没有找到头绪,不管从express还是这个被广为始终的session middleware的相关问题里面都没有查到一点蛛丝马迹了。到最后我都开始怀疑我对session的理解从一开始就存在了严重的错误,都怀疑到人生观价值观了有木有啊。于是乎去找了最基础的资料又把session的实现原理复习了一遍,可是看完之后我又觉得人生观重建:“尼玛,这完全没理解错啊”。但是带着坚定的人生观又狂刷了几遍。。。但是蹭蹭往上跳的session数据又给了我当头一棒 – -!(注意!这里注意chrome的f12里面cookie的值是始终没有变化的,包括expires、maxAge)

        看着前端console和后台完全对不上的情况,三观简直就要崩塌了啊,这尼玛到底是什么个情况。。。。我相信如果这会儿仍然没有灵光一现的话,我肯定会去看http组织原理一类的东西,去把session是怎么写出来都再搞一遍了。但是,上帝没有让我这么做 (因为我如果要这么做了,明后两天大概都要茶饭不思了。。。),突然不知道是憋了泡尿还是被翔一挤,尼玛一摔鼠标:“尼玛蛋,这chrome的调试工具不会有什么问题吧?”,接着果断关掉了f12,再刷新!我去,整个世界都干净了,一切如我最初做刷新时预想的那样,session仍然保持着一个连接一个sessionid的节奏,而不是随着每次刷新都不断增加session了。

        最后您猜是怎么,原来是打开了console台之后,chrome默认对request关闭了cookie发送(但实际上我并没有在控制台设置禁用缓存或者cookie的任何设置,而且resource里面的cookie一直展示出了的是不变的),但是在chrome的console台里面看的话,即使对request抓包,仍然看到有带cookie发送,但实际上呢,服务接收到的是不带cookie的request,尼玛蛋当然不断重建新的session了啊,然后最坑爹的还是在页面浏览上他又保持这cookie的状态,始终能够正常操作(这也为什么我没有一开始就怀疑是浏览器方面存在的问题,或至少知道问题不出在服务端)。

        所以这时候如果在外面对整体的网络quest去抓包的话,我相信应该能看到chrome开启console台之后的连接是默认不允许读cookie的了。而且我认为这样的默认限制可能还不止在cookie上,就如在ie上面你写了console.log,但是不开调试台的话,代码就永远执行不了的坑嗲问题一样,虽然极其简单,但如果一旦陷入到追bug的怪圈里面的话,你把代码看一万遍,甚至把javascript的源码都重看一遍也没用,因为问题根本不是他们。

        看来以后还得多了解一下各种不同browser的console台在执行调试的时候,是否都有些自家的坑嗲默认特性,不至于出现这样的问题的时候,掉入这样的怪洞里面。

        记此博文,希望为后人如有疑惑此问题时能找到个中文参考。因为网上随便搜了搜,好像没发现有人讨论如此的问题,特此一记,也当长个教训。兄弟请牢记:chrome打开调试工具、开发者工具的时候,是会新建一个连接请求,并且这个连接请求里面是每次建立一个全新的连接,包括缓存和cookie都是重新建立,但是在页面中,却保留首次获得的cookie的读取。

        如果有空你能去看google对于控制台特性的描述的话,我相信您会看到开启控制台之后,是进入了一个google为你默认设计好的开发者模式,页面上的响应和你开启控制台后发送页面时所看到的结果有些许的不同。我想,这个是google在设计时为了考虑开发者的操作体验同时又为了避免诸如缓存和服务器既存的一些状态值为调试带来的迷惑而做的。但是,有时候又给我们带来了更多的迷惑。

        最后呢,感谢您还能这么耐心地把这篇吐槽文给看到这里,来来来,给您发朵小红花,如果您对上面我描述的流程不甚明白的话,也可以留言再讨论,文字写的有点混乱,还望海涵。

2 thoughts on “记一个坑爹的夜晚。。。坑爹的console不仅是IE,还有你们喜欢的chrome

发表评论

电子邮件地址不会被公开。 必填项已用*标注