Socket.io:不向特定的socket.id发出

时间:2015-04-25 22:25:20

标签: angularjs node.js sockets socket.io

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

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

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

Sending message to a specific ID in Socket.IO 1.0

Socket.io: Not able send message to particular socket using 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:以下用户中每个用户的数据结构。我还没有放入代码来清除旧的socketId,因此其中一些是不活动的。它是mongoose查询的结果:

// 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

新:用户通过passport.js(facebook auth)登录后,重定向导致socket断开连接,所以socket.id变得无效......现在的问题是它没有重新建立连接...即使是forceNew : true

1 个答案:

答案 0 :(得分:0)

<强>解决:

问题1:无法重新连接。

断开连接(在Passport登录身份验证之后),socket.io没有重新建立连接,因此我在数据库中的socketId已经过时了。通过将此添加到客户端io.on('connect')

来解决此问题
{ 'forceNew' : true }

问题2:本地测试环境

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