Node.js - expressar - session
Pergunta
Eu uso node.js e expressar, Socket.io. Eu uso sessão in expresso.
Como posso ler a sessão e trabalhar com ele em socket.io -? Na parte com conexão
store.userid é indefinido.
var express = require('express')
, stylus = require('stylus')
, nib = require('nib')
, sio = require('socket.io')
, ejs = require('ejs');
store = new express.session.MemoryStore;
app.configure(function () {
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: 'secret', store: store }))
app.use(stylus.middleware({ src: __dirname + '/public', compile: compile }))
app.use(express.static(__dirname + '/public'));
app.set('views', __dirname);
app.set('view engine', 'ejs');
//disable layout
app.set("view options", {layout: false});
});
app.get('/', function(req, res) {
req.session.userid = Math.floor(Math.random()*5000);
});
var io = sio.listen(app)
, nicknames = {};
io.configure(function () {
io.set('transports', ['websocket','flashsocket','xhr-polling']);
});
io.sockets.on('connection', function (socket) {
socket.emit('hello', { hello: store.userid }); //store.userid is undefined
});
Na loja variável:
store =
{ sessions: { 'DNHIsZqgk53zbK3xg8qescJK.dUbdgfVq0D70UaLTMGTzO4yx5vVJral2zIhVsfFGnBA': '{"lastAccess":1326317111111,"cookie":{"originalMaxAge":14399999,"expires":"2012-01-12T01:28:17.266Z",
"httpOnly":true,"path":"/"},"userid":3528}' },
hash: [Function],
generate: [Function] }
Solução
Eu posso estar errado, mas eu não acho que você pode (ou deve) contam com a sessão http a ser preenchida quando você executar o seu manipulador de eventos de conexão. Eles provavelmente estão rodando em diferentes protocolos, ea sessão http conta com o cookie do navegador (que Socket.io pode enviar quando se está fazendo a sondagem XHR, mas provavelmente não se está usando um 'real' socket).
Eu recomendaria ter seus JS cliente buscar o cookie (ou pelo menos a identificação da sessão) manualmente alguma forma (seja por buscar os cookies usando JS ou se você quiser escrever-lo para a página de alguma forma ... sua escolha). Então, quando o cliente faz a conexão, eles podem passar esse valor e você pode usá-lo para associá-lo com a sessão. Há alguns docs sobre como fazer coisas que dura toda a sessão na página github; fazer uma busca por "sessão" aqui: https://github.com/learnboost/socket.io