Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Session 从socket.io回调内部修改会话数据_Session_Node.js_Express - Fatal编程技术网

Session 从socket.io回调内部修改会话数据

Session 从socket.io回调内部修改会话数据,session,node.js,express,Session,Node.js,Express,我目前正在使用这个堆栈表达式,socket.io,sessionstore。我在这里看了这篇文章。 问题是我无法修改socket.io回调中的会话值 从express端访问效果很好,每次刷新后项目都会增加 app.get('/mysession', function(req, res) { req.session.item++; console.log(req.session); res.render('session.jade', { title: 'Sample tit

我目前正在使用这个堆栈表达式,socket.io,sessionstore。我在这里看了这篇文章。 问题是我无法修改socket.io回调中的会话值

从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);
  }
});

sessionStore
API发生了一点变化,现在它的
sessionStore.load(sessionId,cb)
取代了
。get

我发现唯一可行的方法是从
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);
    }
  }
});