来自流星世界&我很好奇如何复制缓存的pubsub / observers功能。对于一个基本的例子,让我们说我有一个todolist,其中每个todo都有一个userId
,我想保持todos私有userId
(但userId
可能存在多个连接的设备,例如电话+桌面)。我想我必须创建一些发布函数来验证发送请求中userId
的{{1}},然后创建一个特定于该查询的套接字命名空间(因为查询可能包含多个{{1}约束)。然后,注册一个发送器,该发送器仅将更改发送到已验证为侦听给定命名空间的那些socketId
。我接近了吗?我的所有研究都只返回基于关键字向所有连接用户发布等基本内容。阅读材料的任何链接都会很棒!这是评论中缺少逻辑的第一次尝试......
userId
答案 0 :(得分:0)
您可以实现一些将新套接字映射到正确用户的方法。例如,您可以将userId
放在Express session中,并将用户的套接字ID存储在一个简单的对象中。
var userSockets = {};
io.sockets.on('connection', function(socket) {
var userId = socket.handshake.session.userId;
if(userSockets[userId]) {
userSockets[userId].push(socket.id);
} else {
userSockets[userId] = [socket.id];
sendTodosByUserId(io, userId)
}
socket.on('disconnect', function() {
var i = userSockets[userId].indexOf(socket.id);
userSockets[userId].splice(i);
if(userSockets[userId].length === 0) {
delete userSockets[userId];
}
});
});
在sendTodosByUsedId
中,您只需遍历属于该用户的套接字数组,并向每个套接字发出。
var sockets = userSockets[userId];
for(var i = 0; i < sockets.length; ++i) {
io.to(sockets[i]).emit('TODO_CHANGE', change);
}
请注意,如果您有多个用户可以连接的节点,则将不工作。然后,您可能必须将userSockets
- 对象存储在例如Redis的。
或者,您可以让您的用户加入一个名为例如user:<userId>
,并在每次todo-change时向其发出。
io.sockets.on('connection', function(socket) {
var userId = socket.handshake.session.userId;
socket.join('user:' + userId);
socket.on('disconnect', function() {
console.log("Rooms are left automatically on disconnect");
}
});
on todo change:
io.to('user:' + userId).emit('TODO_CHANGE', change);