Socket.io和会话数据

6
这是存储临时应用程序数据的合适方式吗?
socket.on('connection', function(client){ 
  client.myappsdata = {
    a: true,
    b: false
  }
}
1个回答

9
我更喜欢稍微重一些的东西。
伪代码:
// 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
@Thomas,上述方法更具可扩展性。此外,我必须在整个socket.io代码中搜索,以确保client对象在各处传递。但我知道sessionId是安全的,可以用作附加到客户端的键/哈希。因此,请使用sessionId作为键存储数据。 - Raynos
@Raynos,使用您的解决方案,您还必须在任何地方传递客户端,因为get和set方法都将客户端对象作为第一个参数,不是吗?这是我个人认为正常且不可避免的,因为我们必须获取客户端的引用以获取其数据。 - Qlimax
@Qlimax 我知道已经过去将近一年了,但这段代码并不依赖于客户端实例本身,它从客户端对象获取sessionId属性并使用该属性而不是实际的客户端实例。不同之处在于,socket.io可能不会始终传递相同的客户端实例,只需创建具有相同sessionId的“socket”对象即可。Raynos的代码即使是这种情况,也可以正常工作,因为它将其哈希值基于sessionId(一个字符串),而不是客户端对象。 - Christopher Tarquini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接