Node.js + Socket.io 在套接字中存储数据

Posted

技术标签:

【中文标题】Node.js + Socket.io 在套接字中存储数据【英文标题】:Node.js + Socket.io Storing data in sockets 【发布时间】:2013-08-21 01:50:45 【问题描述】:

我目前正在使用 node.js 和 socket.io 模块构建一个应用程序。当用户连接时,我将针对用户的套接字存储特定于用户的数据。例如

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

    socket.on('sendmessage', function (data, type) 

        socket.variable1 = 'some value';
        socket.variable2 = 'Another value';
        socket.variable3 = 'Yet another value';
    );
);

虽然这可行,但我的问题是,这是一个好方法吗?我正在有效地存储会话数据,但有更好的方法吗?

【问题讨论】:

【参考方案1】:

更新:io.set()io.get() 方法已弃用

一种合理的方法是选择一个数据存储并将每个数据与一个唯一的套接字标识符(例如 id)相关联。


推荐的方法是使用原生的socket.setsocket.get 专门针对当前套接字异步设置和获取数据。

按照你的例子:

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

    socket.on('sendmessage', function (data, type) 

        socket.set('variable1', 'some value');
        socket.set('variable2', 'Another value');
        socket.set('variable3', 'Yet another value');
    );
);

另外,您可以在设置值后异步调用函数:

...
socket.set('variable1', 'some value', function () 
    /* something to be done after "variable1" is set */
);
...

最后,你可以检索一个变量:

...
var variable1 = socket.get('variable1')
...

或者在需要的时候直接使用:

if ( socket.get('age') > 30 ) 
    // Vida longa às eleições presidenciais diretas no Brasil

【讨论】:

套接字对象were removed in version 1.x上的getset函数【参考方案2】:

我认为您应该将这些变量存储在另一种类型的对象中。保留套接字对象仅用于通信。您可以为每个用户生成一个唯一的 id 并创建一个地图。像这样的:

var map = ,
numOfUsers = 0;

io.sockets.on('connection', function (socket) 
    numOfUsers += 1;
    var user = map["user" + numOfUsers] = ;
    socket.on('sendmessage', function (data, type) 
        user.variable1 = 'some value';
        user.variable2 = 'Another value';
        user.variable3 = 'Yet another value';
    );
);

【讨论】:

谢谢,你的方法更好。来自 php 背景,我一直忘记后端没有“刷新”,因此您可以存储这样的数据而不必担心丢失它。 是的,您可以使用一些额外的模块来为每个用户生成唯一的 ID。使用像 numOfUsers 这样的简单迭代器有点难看。 +1 同时存储user.socket = socket 可能不是一个坏主意,这样您就可以通过知道用户的套接字来识别用户。 使用内置的 socket.id 作为数据结构的键比自己发明更容易。

以上是关于Node.js + Socket.io 在套接字中存储数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 node.js 和 socket.io 应用程序中组织套接字处理

node.js + socket.io + redis 架构 - 水平服务器缩放套接字连接?

Node.js 库“Socket.IO”中“房间”的安全性

Socket.io 不会按需关闭套接字(并且不允许我的 swift 应用程序再次重新连接到 node.js 服务器)

Node.JS 寻找 socket.IO 的替代方案

socket.io 客户端在长 Node.js 函数中自动断开连接