我有一个系统,用户连接到一个房间'使用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
等等,但我没有看到任何方法将元数据附加到客户端连接。
我该怎么做呢?如何确保我可以在页面上看到已连接用户的列表?
答案 0 :(得分:1)
这是一种非常简单且不安全的方法,可以将元数据从客户端传递到服务器,并使用中间件将其附加到套接字。通常只传递会话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
值