CNode

关于express4.0 socketio+session的整合问题

问答
CCCCMMM发布于11 年前最后回复11 年前8 回复5938 浏览0 收藏

困扰了一个星期了,没找到解决方案,还请大家多给些指点; 问题就是如何在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)

B
bimdev#1·11 年前

mark,明天have a try

I
i5ting#2·11 年前
引用 bimdevmark,明天have a try

@bimdev 格式化一下代码吧

Y
youyudehexie#3·11 年前

核心思路,在socket.io 返回的数据包里面,截取header,把header 的cookie 拿出来做解析,然后你就可以重新读取你要的session

C
CCCMMM#4·11 年前
Y
youyudehexie#5·11 年前

你认为的session 池是什么,redis 还是 js 内存? 我是自己写了一个记录用户的key,写在cookie里面,然后通过header带过来。

C
CCCMMM#6·11 年前
引用 youyudehexie你认为的session 池是什么,redis 还是 js 内存? 我是自己写了一个记录用户的key,写在cookie里面,然后通过header带过来。

@youyudehexie js内存吧,socketio这部分代码由于没和设置session的这部分代码在一个文件中,所以不知道怎么引用MemoryStore

Y
youyudehexie#7·11 年前

两点建议,session 放在缓存里面,最基本原因有两个,1.重启app 的时候,不会让session丢失,2.js的内存是很昂贵的,当使用的内存变多,gc时间就会变长。

参与回复
登录后即可参与回复。登录