(更新,之前的思路是错的)问题儿童又来了,请教一下Node的整个HTTP机制,以便可以整理编程思维
发布于 2年前 作者 bigmusic 1108 次浏览

研究了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实例

望指正

11 回复

对象像你这么理解也没问题. 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/

session这个问题,其实是涉及到服务器的底层处理方式。

像Java的web服务器,是多线程调用模型。每用户请求会打开一个线程,每个线程在内容>>中维护着用户的状态。

像PHP的web服务器,是交行CGI的程序处理,CGI是无状态的,所以一般用cookie在客户>的浏览器是维护用户的状态。但cookie在客户端维护的信息是不够的,所以CGI应用要模仿>用户session,就需要在服务器端生成一个session文件存储起来,让原本无状态的CGI应用>,通过中间文件的方式,达到session的效果。

Nodejs的web服务器,也是CGI的程序无状态的,与PHP不同的地方在于,单线程应用, 所有请求都是异步响应,通过callback方式返回数据。如果我们想保存session数据,也是 需要找到一个存储,通过文件存储,redis,Mongdb都可以。

@BiGMuSiC 嗯, 然后就看 Express 中怎么实现的了

@jiyinyiyong

最近研究Session的源码,估计得七七八八了,看最新修改

回到顶部