2012-01-14 3 views
1

Я использую express и socket.io.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 

}); 

ответ

5

Рекомендуемый способ достижения этой цели на самом деле (по крайней мере в моем опыте) должен отказаться от функции 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.

Смежные вопросы