session - 从 socket.io 回调中修改 session 数据

标签 session node.js express

我目前正在使用这个堆栈 express、socket.io、sessionstore。我关注了这里的文章http://www.danielbaulig.de/socket-ioexpress/ . 那么问题是我无法修改 socket.io 回调中的 session 值。

从 express 端访问效果很好,每次刷新后项目都会增加。

app.get('/mysession', function(req, res) {
  req.session.item++;
  console.log(req.session);

  res.render('session.jade', {
    title: 'Sample title'
  });
});

在 socket.io 端使用它不会,这就是问题所在,也许我设置了错误的对象。

var io = io.listen(app);
io.sockets.on('connection', function(socket) {
  var handshake = socket.handshake;
  onlineCount++;
  console.log('Well done id %s', handshake.sessionID);
  handshake.session.item++;

  console.log(handshake.session);

});

这是桥接代码。

io.set('authorization', function(data, accept) {
  if (data.headers.cookie) {
    data.cookie = parseCookie(data.headers.cookie);
    data.sessionID = data.cookie['express.sid'];
    sessionStore.get(data.sessionID, function(err, session) {
      if (err || !session) {
        accept('Error', false);
      } else {
        data.session = session;
        accept(null, true);
      }
    });
  } else {
    return accept('No cookie tansmitted', false);
  }
});

最佳答案

我发现使这项工作起作用的唯一方法是从 connect 事件的请求对象中获取 cookie,用您最喜欢的 cookie 解析器解析它(我使用 connect.utils。 parseCookie),并将其设置在该套接字上,以便我可以在将来的事件中访问它:

socket.on('connection', function(client) {
  var cookie = client.request.headers.cookie;
  var pcookie = connect.utils.parseCookie(cookie);
  var session_id = pcookie["connect.sid"];
  if (session_id) {
    sessionStore.get(session_id, function(err, sess) {
      // do whatever you want with sess here
      // ...
      // if you want to "save" the session for future events
      client.set('session_id', session_id);
    }
  }
});

关于session - 从 socket.io 回调中修改 session 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111007/

相关文章:

node.js - 如何将 shareJS 的文档与文件系统同步

security - 如何在网站上通过 session 管理多个状态?

mysql - 当数据库更改时,socket.io 中的值不会更新

node.js - nodemon 无法正常工作

javascript - 为什么 Node.js htmlparser2 在解析文档时插入额外的 Node ?

javascript - Node.js/Express.js 链证书不工作

node.js - 如何从函数返回值

java - 如何使用 RedisTemplate 访问由 spring redis session 存储的散列 key ?

php - 通过 url 传递 session ID

java - 集群环境中 JMS 主题的 HTTP 使用者