Socket.io:不向特定 socket.id 发射



我正在尝试遍历每个用户的套接字数组并通过他们的套接字 ID 发送消息...但由于某种原因,它没有在前端接收它。

我在下面尝试了这些,但无济于事。

https://github.com/Automattic/socket.io/issues/1618

Socket.IO 1.0 中向特定 ID 发送消息

Socket.io:无法使用 socket.id 将消息发送到特定套接字

后端:

users.forEach(function(subDoc){
  console.log('>> notifyOnline: iterating user...')
  console.log(subDoc);
  // for every socket, send out an emit.
  for (var j = 0, arr = subDoc.socketId.length; j < arr; j++ ) {
    console.log('>> notfiyOnline: sending out good thoughts to clients...');
    console.log('>> EMITTING' + subDoc.socketId[j] + 'is type ' + typeof subDoc.socketId[j] );
    // These don't seem to do anything
    io.sockets.to(subDoc.socketId[j]).emit('notification:new', packet);
    io.to(subDoc.socketId[j]).emit('notification:new', packet);
  }; // end - for each socket
}); // end - forEach user

前端:

  // Listens for users followed online
  socketFactory.on('notification:new', function (data) {
    console.log('>> worldCtrl: Received live notification');
    console.log(data);
    $scope.$applyAsync(function() {
      $scope.rootUser.notifications.push(data);
    });
  }); // end - socketFactory

编辑

@jfriend00:以下用户中每个用户的数据结构。我还没有输入代码来清除旧的套接字 ID,所以其中一些是不活动的。这是猫鼬查询的结果:

// Mongoose Query:
model_onlineUser.find({ 'user._id' : { $in: followers }}, function (err, users) { 
  // notify users (backend code above)
}); // end - find
// Data structure: user in users
[{ _id: 553b49db2242347514c654a9,
  user: 
   { _id: '5503530ed3e910505be02cde',
     displayName: 'some dudes name',
     photo: 'some photo url' },
  __v: 28,
  followers: 
   [ '5525d19a5fb4ee095072c4ad',
     '5525587a04f79c6e4d65015d',
     '55067b0638d1c47238ebabbb' ],
  socketId: 
   [ '2K1_8WQ1JZMUjLx3AAAF',
     'xJqixhGiRb5HYxcoAAAD',
     '7fDqV_DBP3FCTIlLAAAF' ] }]

编辑 2

新增:用户通过护照.js(facebook身份验证)登录后,重定向会导致套接字断开连接,因此 socket.id 无效...现在的问题是它没有重新建立连接......即使有forceNew : true.

已解决:

问题 1:无法重新连接。

断开连接时(在护照登录身份验证之后),socket.io 没有重新建立连接,因此我在数据库中的套接字 ID 已过时。这是通过将其添加到客户端io.on('connect')来解决的:

{ 'forceNew' : true }

问题 2:本地测试环境

我的测试过程需要向其他计算机上的用户发送消息。我们在两个独立的本地服务器上进行测试,所以我们试图向彼此的本地主机发出信号。当我们将测试转移到单个服务器时,套接字开始按预期工作。

最新更新