研究了Session的源码,之前对Node.js完全理解错误了,现在估摸着新的思路
Session源码里写得很清楚,Session自己的MemoryStore,不建议用于成品环境,只建议用于开发环境,至于为什么,下面详细道来.
我先只了解了MemoryStore的原理,如果用户在调用connect.session()的时候,option里没有store参数,session会把store指定为自己的MemoryStore,而这个MemoryStore其实就是在req这个对象下新建一个sessionStore的对象储存用户cookie数据,当用户不断增加时,sessionStore这个对象也会不断增大,所以Linkedln的建议是不要用内置的MemoryStore,这样浪费内存.
而Node.js是单线程的,在server.on(触发后?)req和res并不会销毁一直挂在内存里,我之前理解不了是因为忽略了单线程的特性,每一个用户进来都会新建一个req.session,如果用户的header有sid并能在sessionStore里找到,那么对应sid的内容就会合并到新的session里.如果两个用户同时并发进来,Node.js其实也是按循环事件的调用形式res.end给每个用户,而session中间件早已接管了res.end,使得每次结束连接之前都会把session的内容存进sessionStore.
这里需要注意的是,session不但接管了res.end,而且还在res.on注册了新的’header’事件,这个事件在调用<code>res._renderHeader()</code>的时候触发,用户无论res.write还是res.end都会调用<code>res._renderHeader()</code>,详细可参考Node.js源码.
so,下面的思路是错的! and,严重不建议使用内置的MemoryStore!
##错的:
因为水平低,源码看不懂,都是估摸出来的,所以希望各位指出错误
建立一个异步事件,就是createServer,一个用户连接进来后事件触发
触发后Node会为这个用户建立两个新的对象,分别是req和res
res.end后就是连接断开后,销毁为这个用户建立的两个对象
所以session都是req的属性,在连接断开后session也会跟着被销毁
所以当有N个用户并发进来的时候,就会建立N对req/res实例
望指正
对象像你这么理解也没问题. session倒是需要LZ去搞清楚一下其本质
如果是刚接触 Web 那不错了… Sesstion 应该是另外处理的, 不是链接断开就直接销毁的 大概是 maxAge: http://www.senchalabs.org/connect/middleware-session.html
如果去掉session的描述,其他的对否?
这样啊,连接断开后,res究竟有没销毁?session不是全局对象,就是说res一直没销毁?
这两天花时间把Session源码解构一下
@BiGMuSiC 我主要做前端, 给不出确定的答案… 求助楼下…
@jiyinyiyong
这之前也一直学前端,学着学着发现Node.js是Javascript,学习成本低啊就跳过来了…结果是一堆异步思维和Callback嵌套…也好把前端的MVC都顺道补完
我一直思考Node.js是服务器环境,这里的全局变量应该比客户端安全多了是不?
我想象如果我自己写的Session是一个全局对象里面有已连接的客户端数据,连接关闭后(一段时间内??!)销毁…
@BiGMuSiC 当然没有立即销毁,不过你可以认为它销毁了,垃圾回收不用你操心;Session 非得用不可?有那时间看源码不如找本书系统地学习一下语言基础
@seasonx4
书?例如求指教~
@jiyinyiyong 我擦,这兄弟解答了我N个问题,其中就有session的
http://blog.fens.me/nodejs-express3/
@BiGMuSiC 嗯, 然后就看 Express 中怎么实现的了
@jiyinyiyong
最近研究Session的源码,估计得七七八八了,看最新修改