2012-02-02 20 views
5

Attualmente sto usando questo stack expres, socket.io, sessionstore. Ho seguito l'articolo qui http://www.danielbaulig.de/socket-ioexpress/. Bene, il problema è che non posso modificare i valori di sessione nel callback socket.io.Modifica dei dati di sessione dall'interno del socket.io callback

L'accesso dal lato espresso funziona bene, l'elemento viene aumentato dopo ogni aggiornamento.

app.get('/mysession', function(req, res) { 
    req.session.item++; 
    console.log(req.session); 

    res.render('session.jade', { 
    title: 'Sample title' 
    }); 
}); 

Utilizzando in socket.io lato non è così, e qui è il problema, forse io pongo l'oggetto sbagliato.

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

}); 

Ecco il codice ponte.

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

risposta

3

L'unico modo in cui ho trovato questo lavoro è quello di prelevare il cookie dall'oggetto richiesta sull'evento connect, analizzarlo con il parser cookie preferito (io uso connect.utils.parseCookie) e impostarlo su quel socket in modo che possa accedi ad esso in eventi futuri:

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

Il sessionStore API cambiato un po ', ora il suo sessionStore.load(sessionId, cb) anziché .get.

Problemi correlati