2012-02-02 6 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イベントのリクエストオブジェクトからクッキーを取得し、お気に入りのクッキーパーサー(私は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今、少し変更しました。

関連する問題