题
我正在使用Express框架。我想从socket.io联系会话数据。我尝试使用client.listener.server.dynamicviewhelpers数据Express Dynamichelpers数据,但我无法获取会话数据。有什么简单的方法吗?请查看代码
app.listen(3000);
var io = require('socket.io');
var io = io.listen(app);
io.on('connection', function(client){
// I want to use session data here
client.on('message', function(message){
// or here
});
client.on('disconnect', function(){
// or here
});
});
解决方案
这对于通过FlashSocket传输的插座不起作用(它不会向服务器发送所需的cookie),但可靠地适用于其他所有内容。我只是禁用代码中的FlashSocket运输。
为了使其正常工作,在Express/Connect侧,我明确定义了会话存储,因此我可以在套接字内使用它:
MemoryStore = require('connect/middleware/session/memory'),
var session_store = new MemoryStore();
app.configure(function () {
app.use(express.session({ store: session_store }));
});
然后在我的套接字代码中,包括连接框架,以便我可以使用其cookie解析来检索cookie的连接。然后,我在具有连接的会话商店中查找会话。SID像这样:
var connect = require('connect');
io.on('connection', function(socket_client) {
var cookie_string = socket_client.request.headers.cookie;
var parsed_cookies = connect.utils.parseCookie(cookie_string);
var connect_sid = parsed_cookies['connect.sid'];
if (connect_sid) {
session_store.get(connect_sid, function (error, session) {
//HOORAY NOW YOU'VE GOT THE SESSION OBJECT!!!!
});
}
});
然后,您可以根据需要使用会话。
其他提示
我建议不要完全重新发明轮子。您需要的工具已经是NPM软件包。我认为这是您需要的: session.socket.io这些天我正在使用它,我猜这将非常有帮助!将快递链接到socket.io层将具有很多优势!
编辑: 在尝试了一些不起作用的模块之后,我实际上走了并写了自己的图书馆来做到这一点。无耻的插头:请在 https://github.com/aviddiviner/socket.io-sessions. 。我将在下面留出我的旧帖子出于历史目的:
我非常整齐地得到这项工作,而不必绕过 flashsocket 按照运输 PR0ZAC上面的解决方案。我也在使用socket.io的express.io。就是这样。
首先,将会话ID传递给视图:
app.get('/', function(req,res){
res.render('index.ejs', {
locals: {
connect_sid: req.sessionID
// ...
}
});
});
然后在您的视图中,将其链接到socket.io客户端:
<script>
var sid = '<%= connect_sid %>';
var socket = new io.Socket();
socket.connect();
</script>
<input type="button" value="Ping" onclick="socket.send({sid:sid, msg:'ping'});"/>
然后在您的服务器端socket.io侦听器中,捡起并读取/编写会话数据:
var socket = io.listen(app);
socket.on('connection', function(client){
client.on('message', function(message){
session_store.get(message.sid, function(error, session){
session.pings = session.pings + 1 || 1;
client.send("You have made " + session.pings + " pings.");
session_store.set(message.sid, session); // Save the session
});
});
});
就我而言,我的 session_store
是redis,使用 redis-connect
图书馆。
var RedisStore = require('connect-redis');
var session_store = new RedisStore;
// ...
app.use(express.session({ store: session_store }));
希望这对在搜索Google时找到此帖子的人有帮助(就像我一样;)
看到这个: socket.io身份验证
我建议不要通过 client.request...
或者 client.listener...
因为那不是直接附着在 client
对象,始终指向最后登录的用户!
查看 socket.io-connect
连接websocket中间件包装器围绕socket.io节点https://github.com/bnoguchi/socket.io-connect
这将使您可以将socket.io请求推向Express/Connect中间件堆栈,然后再使用socket.io事件处理程序处理,使您可以访问会话,cookie等。虽然,我不确定它与所有socket.io的运输量一起使用。
您可以使用 Express-Socket.io-Session .
与socket.io共享基于Cookie的Express-Session中间件。使用Express> 4.0.0和socket.io> 1.0.0,并且不会向后兼容。
为我工作!
您可以看一下: https://github.com/bmeck/session-web-sockets
或者您可以使用:
io.on('connection', function(client) {
var session = client.listener.server.viewHelpers;
// use session here
});
希望这可以帮助。
我不确定我做对了。https://github.com/learnboost/socket.io/wiki/authorizing
使用握手数据,您可以访问cookie。在cookie中,您可以获取连接。SID是每个客户端的会话ID。然后使用Connect.SID从数据库中获取会话数据(我假设您正在使用RedisStore)