研究了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'事件,这个事件在调用res._renderHeader()的时候触发,用户无论res.write还是res.end都会调用res._renderHeader(),详细可参考Node.js源码.
so,下面的思路是错的! and,严重不建议使用内置的MemoryStore!
##错的:
因为水平低,源码看不懂,都是估摸出来的,所以希望各位指出错误
建立一个异步事件,就是createServer,一个用户连接进来后事件触发
触发后Node会为这个用户建立两个新的对象,分别是req和res
res.end后就是连接断开后,销毁为这个用户建立的两个对象
所以session都是req的属性,在连接断开后session也会跟着被销毁
所以当有N个用户并发进来的时候,就会建立N对req/res实例
望指正