Экспресс - socket.io - сеанс чтения - PullRequest
1 голос
/ 14 января 2012

Я пользуюсь express и socket.io.

При создании сеанса с экспресс-постом. Нажмите на кнопку и, используя Ajax и метод POST (логин), я сохраняю сеанс.

 app.post('/login', function(req, res){
         req.session.loginid = req.body.lgnid;
    });

В socket.io он не может читать.

Спасибо за совет.

Мой исходный код .:

var express = require('express');
var app = express.createServer();
var io = require('socket.io').listen(app); 
var MemoryStore = express.session.MemoryStore;
var sessionStore = new MemoryStore();
var parseCookie = require('connect').utils.parseCookie;
var Session = require('connect').middleware.session.Session;
var stylus = require('stylus');
  app.use(express.bodyParser());
  app.use(express.cookieParser());
  app.use(express.session({store: sessionStore
        , secret: 'secret'
        , key: 'express.sid'}));

  app.use(stylus.middleware({ src: __dirname + '/public', compile: compile }))
  app.use(express.static(__dirname + '/public'));
  app.set('views', __dirname);

 // disable layout
  app.set("view options", {layout: false});

  // make a custom html template
  app.register('.html', {
    compile: function(str, options){
      return function(locals){
        return str;
      };
    }
  });

  function compile (str, path) {
    return stylus(str)
      .set('filename', path)
      .use(nib());
  };

var Session = require('connect').middleware.session.Session;
sio.set('authorization', function (data, accept) {
    if (data.headers.cookie) {
        data.cookie = parseCookie(data.headers.cookie);
        data.sessionID = data.cookie['express.sid'];
        // save the session store to the data object 
        // (as required by the Session constructor)
        data.sessionStore = sessionStore;
        sessionStore.get(data.sessionID, function (err, session) {
            if (err || !session) {
                accept('Error', false);
            } else {
                // create a session object, passing data as request and our
                // just acquired session data
                data.session = new Session(data, session);
                accept(null, true);
            }
        });
    } else {
       return accept('No cookie transmitted.', false);
    }
});

Как загрузить и сохранить данные из sessionStore?

io.sockets.on('connection', function (socket) {

    var hs = socket.handshake;
    console.log('Session : ' + hs.session.loginid + '); //Session : undefined

});

1 Ответ

5 голосов
/ 11 июня 2012

Рекомендованный способ добиться этого на самом деле (по крайней мере, по моему опыту) - отказаться от функции sessionStore.get и вместо этого перейти на sessionStore.load - разница в том, что при загрузке обратный вызов получает экземпляр сеанса вместо необходимостисоздай сам.Разница заключается в том, что вы просто берете свой фрагмент:

sessionStore.get(data.sessionID, function (err, session) {
    if (err || !session) {
        accept('Error', false);
    } else {
        // create a session object, passing data as request and our
        // just acquired session data
        data.session = new Session(data, session);
        accept(null, true);
    }
});

и меняете его на:

sessionStore.load(data.sessionID, function(err, session) {
  if (err || !session) {
    accept("Error", false);
  } else {
    data.session = session;
    accept(null, true);
  }
});

И оттуда вы сможете получить доступ к сеансу при попытке, например, socket.handshake.session, однако при работе с сеансом, если вы вносите изменения в событие сокета, вы должны вручную сохранить сеанс.Если вы добавляете / удаляете вещи, которые вы должны: session.save([callback]).

Я понимаю, что это не очень хороший ответ, поскольку я говорю вам делать примерно то, что вы уже есть, но это работает для меня прямо сейчасс Express 2.5.8 и Socket.IO 0.9.6.

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