2012-02-02 11 views
5

Actualmente estoy usando esta pila expres, socket.io, sessionstore. Seguí el artículo aquí http://www.danielbaulig.de/socket-ioexpress/. Bueno, el problema es que no puedo modificar los valores de la sesión en la devolución de llamada socket.io.Modificar los datos de la sesión desde dentro de la devolución de llamada socket.io

El acceso desde el lado express funciona bien, el elemento aumenta después de cada actualización.

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

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

Usar en el lado socket.io no es así y aquí está el problema, tal vez estoy configurando el objeto equivocado.

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

}); 

Aquí está el código del puente.

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

Respuesta

3

La única forma que encontré para hacer esto funciona es tomar la cookie del objeto de solicitud en el evento connect, analizarlo con su analizador de cookies favorito (uso connect.utils.parseCookie), y configurarlo en ese socket para que pueda acceda a él en eventos futuros:

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

La API sessionStore cambiado un poco, ahora sessionStore.load(sessionId, cb) su lugar de .get.

Cuestiones relacionadas