关于express4.0 socketio+session的整合问题
发布于 1 个月前 作者 CCCMMM 442 次浏览 来自 问答

困扰了一个星期了,没找到解决方案,还请大家多给些指点; 问题就是如何在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中间件,好像很多也不适用了

8 回复

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缓存中吗?这个我不怎么会啊,求指教

回到顶部