2012-01-11 60 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