Socket.io 和会话数据

Posted

技术标签:

【中文标题】Socket.io 和会话数据【英文标题】:Socket.io and session data 【发布时间】:2011-09-07 23:46:43 【问题描述】:

这是存储我的临时应用数据的合适方式吗?

socket.on('connection', function(client) 
  client.myappsdata = 
    a: true,
    b: false
  

【问题讨论】:

【参考方案1】:

我更喜欢稍微重一点的东西。

伪代码:

// ClientManager.js
var Manager = new function() 
    this._clients = [];

    this.set = function(client, data) 
        this._clients[client.sessionId] = data;    
    ;

    this.get = function(client) 
        return this._clients[client.sessionId];            
    

;

module.exports = function() 
    return Object.create(Manager);
;

// main.js
var manager = require("ClientManager")();

/* ... */

socket.on("connection", function(client) 
    manager.set(client, 
       /* ... */ 
    );

基本上每个客户端都有一个sessionId,因此将他们的数据存储在由该 sessionId 键入的哈希中

【讨论】:

有什么理由不按我的方式做吗? @Thomas 上述方法可扩展性更强。此外,我还必须搜索整个 socket.io 代码,以确保 client 对象到处传递。我所知道的是sessionId 可以安全地使用密钥/哈希附加到客户端。因此将数据存储在由 sessionId 键入的哈希中 @Raynos 使用您的解决方案,您还必须在任何地方传递客户端,因为 get 和 set 方法都将客户端对象作为第一个参数,不是吗?也就是说,IMO 是正常且不可避免的,因为我们必须获得客户端的引用才能获取其数据。 @Qlimax 我知道这已经差不多一年了,但是代码不依赖于客户端实例本身,它从客户端对象中获取 sessionId 属性并使用它而不是实际的客户端实例。不同之处在于 socket.io 可能不会一直传递相同的客户端实例,只需创建具有相同 sessionId 的“socket”对象。即使是这种情况,Raynos 的代码也可以工作,因为它基于 sessionId(字符串)的哈希而不是客户端对象

以上是关于Socket.io 和会话数据的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 身份验证与共享会话数据,io.use() 如何工作

Socket.io 会话管理?

socket.io 和 express 4 个会话

PHP + socket.io(会话、授权和安全问题)

如何处理 Socket.io 和 Express 的会话?

使用 Express.js v4 和 Socket.io v1 的会话