2012-01-14 18 views
1

私はexpressとsocket.ioを使用しています。Express - socket.io - 読書セッション

エクスプレスポストでセッションを作成するとき。ボタンをクリックし、AjaxとPOSTメソッド(ログイン)を使用して、セッションを保存します。

app.post('/login', function(req, res){ 
     req.session.loginid = req.body.lgnid; 
    }); 

socket.ioでは読み込めません。

アドバイスをいただきありがとうございます。

私のソースコード:セッションストアからデータをロードして保存する方法

var express = require('express'); 
var app = express.createServer(); 
var io = require('socket.io').listen(app); 
var MemoryStore = express.session.MemoryStore; 
var sessionStore = new MemoryStore(); 
var parseCookie = require('connect').utils.parseCookie; 
var Session = require('connect').middleware.session.Session; 
var stylus = require('stylus'); 
    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({store: sessionStore 
     , secret: 'secret' 
     , key: 'express.sid'})); 

    app.use(stylus.middleware({ src: __dirname + '/public', compile: compile })) 
    app.use(express.static(__dirname + '/public')); 
    app.set('views', __dirname); 

// disable layout 
    app.set("view options", {layout: false}); 

    // make a custom html template 
    app.register('.html', { 
    compile: function(str, options){ 
     return function(locals){ 
     return str; 
     }; 
    } 
    }); 

    function compile (str, path) { 
    return stylus(str) 
     .set('filename', path) 
     .use(nib()); 
    }; 

var Session = require('connect').middleware.session.Session; 
sio.set('authorization', function (data, accept) { 
    if (data.headers.cookie) { 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['express.sid']; 
     // save the session store to the data object 
     // (as required by the Session constructor) 
     data.sessionStore = sessionStore; 
     sessionStore.get(data.sessionID, function (err, session) { 
      if (err || !session) { 
       accept('Error', false); 
      } else { 
       // create a session object, passing data as request and our 
       // just acquired session data 
       data.session = new Session(data, session); 
       accept(null, true); 
      } 
     }); 
    } else { 
     return accept('No cookie transmitted.', false); 
    } 
}); 

io.sockets.on('connection', function (socket) { 

    var hs = socket.handshake; 
    console.log('Session : ' + hs.session.loginid + '); //Session : undefined 

}); 

答えて

5

AはsessionStore.get機能を断念し、代わりにsessionStore.loadのために行くために(少なくとも私の経験では)実際にこれを達成するための方法ですが、推奨 - の違いは、負荷のコールバックがあるのではなく、セッションインスタンスを与えているということです自分自身を作成する。違いは、単にあなたのスニペット取っている:

sessionStore.get(data.sessionID, function (err, session) { 
    if (err || !session) { 
     accept('Error', false); 
    } else { 
     // create a session object, passing data as request and our 
     // just acquired session data 
     data.session = new Session(data, session); 
     accept(null, true); 
    } 
}); 

をし、それを変更する:

sessionStore.load(data.sessionID, function(err, session) { 
    if (err || !session) { 
    accept("Error", false); 
    } else { 
    data.session = session; 
    accept(null, true); 
    } 
}); 

そして扱うときに、そこから、あなたがしようとしてしかし、そのようなsocket.handshake.sessionとして、セッションにアクセスすることができるはずですセッションを変更する場合は、手動でセッションを保存する必要があります。追加/削除する場合は、session.save([callback])にする必要があります。

私はこれがあなたのおおよそのことをお伝えしているので、これはあまり答えではないことを認識していますが、これはExpress 2.5.8とSocket.IO 0.9.6で現在私のために働いています。