Изменение данных сеанса внутри обратного вызова socket.io - PullRequest
5 голосов
/ 02 февраля 2012

Я сейчас использую этот стек expres, socket.io, sessionstore.Я следовал за этой статьей http://www.danielbaulig.de/socket-ioexpress/. Проблема в том, что я не могу изменить значения сеанса в обратном вызове socket.io.

Доступ с экспресс-стороны работает хорошо, элемент увеличивается после каждого обновления.

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

Ответы [ 2 ]

3 голосов
/ 02 июня 2012

Единственный способ, с помощью которого я нашел эту работу, - это извлечь файл cookie из объекта запроса в событии connect, проанализировать его с помощью вашего любимого анализатора файлов 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);
    }
  }
});
2 голосов
/ 02 июня 2012

API sessionStore немного изменился, теперь его sessionStore.load(sessionId, cb) вместо .get.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...