我有一个系统,用户可以使用Socket.io连接到"房间"。现在,当人们加载页面时,连接就完成了,我可以看到有多少人连接到给定的页面(指定房间的URL)。
我想要的是能够在页面上查看有关用户的元数据。我想知道鲍勃、史蒂夫和玛丽正在看那一页。现在我只得到内部会话ID。
服务器
io.on('connection', function(socket) {
socket.on('viewPage', function(data, fn) {
var roomName = 'page-' + data.url;
socket.join(roomName);
var room = io.sockets.adapter.rooms[roomName];
console.log(Object.keys(room).length + ' users connected');
fn({msg: 'Connected to room ' + roomName})
})
});
客户端
var socket = io();
socket = io.connect("http://localhost:5000");
socket.on('connect', function(data) {
socket.emit('viewPage', {url: '/foo/bar'}, function(resp) {
console.log(resp)
});
});
从Socket.io文档中可以看到join
等等,但我看不到任何将元数据附加到客户端连接的方法。
我该怎么做?如何确保我可以在页面上看到已连接用户的列表?
这里有一种非常简单且不安全的方法,可以将元数据从客户端传递到服务器,并使用中间件将其附加到套接字。通常只传递一个会话id,并在服务器上获取数据,但我已经偷工减料了。
//Client
socket = io.connect("http://localhost:5000", {query: 'name=Bob'});
//Server
io.use(function (socket, next){
var name = socket.handshake.query.name;
socket._name = name;
next();
});
现在你可以做:
var room = io.sockets.adapter.rooms[roomName];
for (var key in room){
console.log(room[key]._name);
}
请注意,您应该处理来自同一用户的多选项卡,因此您只需要显示不同的_name
值