sli*_*ier 5 javascript node.js socket.io
我想知道如何共享在一个命名空间中的套接字中设置的数据并在另一个命名空间中访问它?
我完全知道我可以将数据附加到套接字对象本身.当我在一个命名空间上附加数据并尝试在另一个命名空间上访问它时,会出现问题.
下面演示了这个问题
var io = require( 'socket.io' );
module.exports.init = function( server ) {
io = io.listen( server );
io.of( '/chatSystem' ).on( 'connection', function( socket ) {
/*handling set nickname event*/
socket.on( 'set.name', function( data ) {
/*attach nickname key to this socket*/
socket.nickname = data.name;
socket.broadcast.emit( 'user.entered', data );
});
});
io.of( '/chatUser').on( 'connection', function( socket ) {
/*handling client event socket.send*/
socket.on( 'message', function( data ) {
data = JSON.parse( data );
data.nickname = socket.nickname; // <--- this is undefined
/*send to all connected client( broadcast will not send message to socket that created the message)*/
socket.broadcast.send( JSON.stringify( data ) );
data.type = 'myMessage';
/*manually send back the message to the socket that created the message*/
socket.send( JSON.stringify( data) );
});
});
};
Run Code Online (Sandbox Code Playgroud)
有没有办法来解决这个问题?
更新我的答案以获得更通用和“更安全”的解决方案
事实证明,我们可以跨命名空间共享数据,但我们必须通过将套接字实例从一个命名空间引用到另一个命名空间来实现这一点。
假设有两个命名空间,即namespace_A和namespace_B。
为了从namespace_B中获取namepsace_A上相应的套接字对象,我们使用当前套接字对象的 ID(因为它会类似)从namespace_A命名空间对象中的连接对象中获取它。
虽然这仍然是一种解决方法,但这是迄今为止我能够在命名空间之间共享会话数据的最佳和最安全的方式。
我们将使用 socket.id 来引用所需的套接字。ID 看起来像这样:/namespace#vCpuzzUi4RI1DHqfAAAH。命名空间内的每个套接字实例都具有类似的 ID(除了命名空间部分),即,对于命名空间_A,ID 类似于 ,/namespace_A#vCpuzzUi4RI1DHqfAAAH而对于命名空间_B 则类似于/namespace_B#vCpuzzUi4RI1DHqfAAAH。因此,如果我们可以生成一个类似于当前套接字的套接字 ID 并使用它,那么我们就可以从一个名称空间引用另一个套接字实例。
我们需要做的是首先在开头声明一个变量,例如:
var self = this;
Run Code Online (Sandbox Code Playgroud)
这用于保存对当前对象的引用。接下来,在一个命名空间中,假设命名空间_A,我们需要从命名空间_B的套接字实例获取数据,方法是在 A 中编写以下代码:
ns_b_socket = self.namespace_B.connected['/namespace_B#' + buildSocketID(socket.id)];
Run Code Online (Sandbox Code Playgroud)
我们使用当前实例的namespace_B self.namespace_B,然后通过它调用connected。
命名空间#connected:对象
连接到按 id 索引的此命名空间的 Socket 对象的哈希值。
我使用自定义函数来生成 ID。
function buildSocketID(iden) {
return iden.split('#')[1];
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您调用ns_b_socket.usernamefrom ,您将获得为from namespace_Bnamespace_A设置的值。socket.username
注意:这适用于 1.0.x 及更高版本。对于低于此的版本,请参阅此处。
| 归档时间: |
|
| 查看次数: |
1814 次 |
| 最近记录: |