Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor 通过socketio重新思考动态pubsubs的DB模式_Meteor_Socket.io_Rethinkdb - Fatal编程技术网

Meteor 通过socketio重新思考动态pubsubs的DB模式

Meteor 通过socketio重新思考动态pubsubs的DB模式,meteor,socket.io,rethinkdb,Meteor,Socket.io,Rethinkdb,来自流星世界&我很好奇如何复制缓存的pubsub/observators功能。举个基本的例子,假设我有一个todo列表,其中每个todo都有一个用户ID,我想让每个用户ID(但是用户ID可以存在于多个连接的设备上,例如电话+桌面)。我想我必须创建一些发布函数,通过发送的请求中的socketId验证userId,然后创建一个特定于该查询的套接字名称空间(因为该查询可能包含不止一个userId约束)。然后,注册一个发射器,该发射器只将更改发送到那些已验证为侦听给定命名空间的socketIds。我接近

来自流星世界&我很好奇如何复制缓存的pubsub/observators功能。举个基本的例子,假设我有一个todo列表,其中每个todo都有一个
用户ID
,我想让每个
用户ID
(但是
用户ID
可以存在于多个连接的设备上,例如电话+桌面)。我想我必须创建一些发布函数,通过发送的请求中的
socketId
验证
userId
,然后创建一个特定于该查询的套接字名称空间(因为该查询可能包含不止一个
userId
约束)。然后,注册一个发射器,该发射器只将更改发送到那些已验证为侦听给定命名空间的
socketId
s。我接近了吗?我所有的研究只是根据关键字向所有连接的用户返回一些基本的东西,比如发布。任何阅读材料的链接都会很棒!这是注释中缺少逻辑的第一次尝试

export function sendTodosByUserId(io, userId) {
  //How to auth? By linking a client socketId to a user in a lookup table?
  connect()
    .then(conn => {
      r
        .table('todos')
        .filter(todos => todos("userId").eq(userId))
        .changes().run(conn, (err, cursor) => {
        cursor.each((err, change) => {
          //Do I emit a unique message? namespace?  How do I handle 2 clients using the same userId?
          io.emit('TODO_CHANGE', change);
        });
      });
    });
}

您可以实现某种将新套接字映射到正确用户的方法。例如,您可以将
用户ID
放在一个简单的对象中,并将用户的套接字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);
}
关于待办事项变更:

io.to('user:' + userId).emit('TODO_CHANGE', change);

您可以实现某种将新套接字映射到正确用户的方法。例如,您可以将
用户ID
放在一个简单的对象中,并将用户的套接字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);
}
关于待办事项变更:

io.to('user:' + userId).emit('TODO_CHANGE', change);

谢谢不幸的是,我认为这不会垂直或水平扩展,如果socketId更改,甚至可能在重新连接时失败。。。我想还在找那颗银弹。现在,我已经选择了SocketCluster谢谢!不幸的是,我认为这不会垂直或水平扩展,如果socketId更改,甚至可能在重新连接时失败。。。我想还在找那颗银弹。现在,我已经决定使用socketcluster