困扰了一个星期了,没找到解决方案,还请大家多给些指点; 问题就是如何在socketio中,如何使用session获得获取连接的用户; 下面是代码: app.js
var session_store=new session.MemoryStore({
reapInterval: 60000*10
});
app.use(session({
secret:'secret',
cookie:{
maxAge:1000*60*30
},
store:session_store
}));
www中:
/**
* Module dependencies.
*/
var session =require('express-session');
var app = require('../app');
var debug = require('debug')('test:server');
var server=require('http').Server(app);
var io=require('socket.io').listen(server);
var store=session.MemoryStore;
//socketio module
io.on('connection',function(socket){
console.log('a user connected');
var cookie_string=socket.request.headers.cookie;
var mat=cookie_string.match(/sid=.+/);
var sid=cookie_string.substring(mat['index']+4);
if(sid.indexOf(';'))
sid=sid.substring(0,sid.indexOf(';'));
store.get(sid, function (err, session) {
if(err)
console.log("error:",err);
else
console.log("user:",session.user);
});
我目前的方案是将session存储在.MemoryStore,让后想在www中得到这个store,再通过get方法得到这个session,但碰到了2个问题: 1.这个store我试了很多方法,都没法在www中调用 2.好像4.0的写法store没有get这个属性 网上的例子大多是以express3.0为版本的,感觉3.0和4.0最大的不同在与有一个启动的js—www,这给我最直接的影响就是只能把socketio模块写在了www里面而不是app.js中 ,还有就是connect中间件,好像很多也不适用了
mark,明天have a try
@bimdev 格式化一下代码吧
核心思路,在socket.io 返回的数据包里面,截取header,把header 的cookie 拿出来做解析,然后你就可以重新读取你要的session
@youyudehexie connect.sid可以截取到,但是无法得到保存的session池这是最大的问题
你认为的session 池是什么,redis 还是 js 内存? 我是自己写了一个记录用户的key,写在cookie里面,然后通过header带过来。
@youyudehexie js内存吧,socketio这部分代码由于没和设置session的这部分代码在一个文件中,所以不知道怎么引用MemoryStore
两点建议,session 放在缓存里面,最基本原因有两个,1.重启app 的时候,不会让session丢失,2.js的内存是很昂贵的,当使用的内存变多,gc时间就会变长。
@youyudehexie 你的意思是放在redis缓存中吗?这个我不怎么会啊,求指教