2012-01-11 83 views
4

我使用node.js和express,socket.io。 我在Express中使用會話。Node.js - express - session

如何閱讀會話並在socket.io中與他一起工作 - 在連接的部分?

store.userid未定義。

var express = require('express') 
    , stylus = require('stylus') 
    , nib = require('nib') 
    , sio = require('socket.io') 
    , ejs = require('ejs'); 

store = new express.session.MemoryStore; 

app.configure(function() { 

    app.use(express.bodyParser()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ secret: 'secret', store: store })) 

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

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

app.get('/', function(req, res) { 

req.session.userid = Math.floor(Math.random()*5000); 

}); 


var io = sio.listen(app) 
    , nicknames = {}; 
io.configure(function() { 
    io.set('transports', ['websocket','flashsocket','xhr-polling']); 
}); 


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

    socket.emit('hello', { hello: store.userid }); //store.userid is undefined 

    }); 

在變量店:

店=

{ sessions: { 'DNHIsZqgk53zbK3xg8qescJK.dUbdgfVq0D70UaLTMGTzO4yx5vVJral2zIhVsfFGnBA': '{"lastAccess":1326317111111,"cookie":{"originalMaxAge":14399999,"expires":"2012-01-12T01:28:17.266Z", 
"httpOnly":true,"path":"/"},"userid":3528}' }, 
    hash: [Function], 
    generate: [Function] } 

回答

2

我可能是錯的,但我不認爲你可以(或應該)依靠HTTP會話中填充當你運行你的連接事件處理程序。它們很可能運行在不同的協議上,而http會話依賴於瀏覽器cookie(在執行xhr輪詢時socket.io 可能會發送,但如果它使用'真實'套接字,則可能不會)。

我建議讓你的客戶端JS以某種方式手動獲取cookie(或者至少會話ID)(或者通過使用JS獲取cookie,或者如果你想以某種方式將它寫入頁面......你的選擇)。然後,當客戶端建立連接時,他們可以傳遞該值並且可以使用它將其與會話相關聯。有一些文檔可以在github頁面上完成所有會話;請在此處搜索「會話」:https://github.com/learnboost/socket.io

+0

當我可以在客戶端使用Cookie時 - 這是一種安全的解決方案嗎?在客戶端保存cookies sessionid? – Jenan 2012-01-11 22:43:16

+3

本教程非常棒 - http://www.danielbaulig.de/socket-ioexpress/ - 已解決。 – Jenan 2012-01-11 23:13:05