2012-02-02 33 views
5

我目前使用這個堆棧expres,socket.io,sessionstore。我跟着這裏的文章http://www.danielbaulig.de/socket-ioexpress/。 那麼問題是,我不能修改socket.io回調中的會話值。從socket.io回調中修改會話數據

從快捷方式訪問效果很好,每次刷新後項目都會增加。

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

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

在socket.io方面使用它不,這裏是問題,也許我設置了錯誤的對象。

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

}); 

這是橋碼。

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

回答

3

我發現完成這項工作的唯一方法是從connect事件上的請求對象中獲取cookie,使用您最喜歡的cookie解析器(我使用connect.utils.parseCookie)解析它,並將其設置在該套接字上,以便我可以在未來的活動中訪問它:

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

sessionStore API改變了一點點,現在其sessionStore.load(sessionId, cb)代替.get