研究了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实例
望指正
这之前也一直学前端,学着学着发现Node.js是Javascript,学习成本低啊就跳过来了…结果是一堆异步思维和Callback嵌套…也好把前端的MVC都顺道补完
我一直思考Node.js是服务器环境,这里的全局变量应该比客户端安全多了是不?
我想象如果我自己写的Session是一个全局对象里面有已连接的客户端数据,连接关闭后(一段时间内??!)销毁…
@jiyinyiyong 我擦,这兄弟解答了我N个问题,其中就有session的
http://blog.fens.me/nodejs-express3/
session这个问题,其实是涉及到服务器的底层处理方式。
像Java的web服务器,是多线程调用模型。每用户请求会打开一个线程,每个线程在内容>>中维护着用户的状态。
像PHP的web服务器,是交行CGI的程序处理,CGI是无状态的,所以一般用cookie在客户>的浏览器是维护用户的状态。但cookie在客户端维护的信息是不够的,所以CGI应用要模仿>用户session,就需要在服务器端生成一个session文件存储起来,让原本无状态的CGI应用>,通过中间文件的方式,达到session的效果。
Nodejs的web服务器,也是CGI的程序无状态的,与PHP不同的地方在于,单线程应用, 所有请求都是异步响应,通过callback方式返回数据。如果我们想保存session数据,也是 需要找到一个存储,通过文件存储,redis,Mongdb都可以。