我试图遍历每个用户的套接字数组并通过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
。
答案 0 :(得分:0)
<强>解决:强>
问题1:无法重新连接。
断开连接(在Passport登录身份验证之后),socket.io没有重新建立连接,因此我在数据库中的socketId已经过时了。通过将此添加到客户端io.on('connect')
:
{ 'forceNew' : true }
问题2:本地测试环境
我的测试程序需要向其他计算机上的用户发送消息。我们在两个独立的本地服务器上进行测试,因此我们尝试向对方的本地主机发送信号。当我们将测试移动到单个服务器时,套接字开始按预期工作。