通过socketio动态pubsubs的Rethinkdb模式

时间:2015-11-12 02:48:21

标签: meteor socket.io rethinkdb

来自流星世界&我很好奇如何复制缓存的pubsub / observers功能。对于一个基本的例子,让我们说我有一个todolist,其中每个todo都有一个userId,我想保持todos私有userId(但userId可能存在多个连接的设备,例如电话+桌面)。我想我必须创建一些发布函数来验证发送请求中userId的{​​{1}},然后创建一个特定于该查询的套接字命名空间(因为查询可能包含多个{{1}约束)。然后,注册一个发送器,该发送器仅将更改发送到已验证为侦听给定命名空间的那些socketId。我接近了吗?我的所有研究都只返回基于关键字向所有连接用户发布等基本内容。阅读材料的任何链接都会很棒!这是评论中缺少逻辑的第一次尝试......

userId

1 个答案:

答案 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);