有没有办法获取所有当前连接的用户的列表?我检查了许多聊天室教程,但没有一个提供这种方法。是否有可能,如果可以,如何以 Meteor 的方式正确实施它?
问问题
5249 次
6 回答
18
我已经设法找到一种方法来做到这一点,而无需使用低效的保活。基本上,用户登录或重新连接设置profile.online
为 true,注销或断开连接设置为 false。您可以将其添加为 Meteorite 智能包并在此处试用:
https://github.com/mizzao/meteor-user-status
修复或改进表示赞赏。
于 2013-06-21T22:51:03.027 回答
3
我们通过在用户登录时设置在线属性,然后定期 ping(每 10 秒)并将所有非活动用户设置为离线来实现这一点。不理想,但它有效。很想在 Meteor 中看到这个功能。这是ping功能。
Meteor.setInterval(function () {
var now = (new Date()).getTime();
OnlineUsers.find({'active':true,'lastActivity': {$lt: (now - 30 * 1000)}}).forEach(function (onlineActivity) {
if(onlineActivity && onlineActivity.userId) {
OnlineUsers.update({userId:onlineActivity.userId},{$set: {'active': false}});
Meteor.users.update(onlineActivity.userId,{$set: {'profile.online': false}});
}
});
}, 10000);
于 2012-11-23T05:55:15.500 回答
1
老问题,但是对于任何研究这个问题的人来说,现在有一个流星包可以监控客户端到服务器的连接。它被称为流星用户状态,可以在 github 上找到。
于 2015-02-20T06:18:59.673 回答
0
我正在做的是在流星应用程序的浏览器选项卡有或失去焦点时记录用户的在线状态。然后过滤在线用户。必须有更好的解决方案,但这个可行。
if Meteor.is_client
Meteor.startup ->
$(window).focus ->
Meteor.call 'online', true
$(window).blur ->
Meteor.call 'online', false
else
Meteor.methods
online: (isOnline=true) ->
Meteor.users.update Meteor.userId(), $set: online: isOnline
然后你可以使用
Meteor.users.find online: true
过滤在线用户。
顺便说一句,不要忘记使用在线字段发布用户。
Meteor.publish null, ->
Meteor.users.find {}, fields: online: 1
于 2012-11-07T00:15:34.547 回答
0
我已经结束了。服务器代码:
Meteor.startup ->
Meteor.methods
keepalive: (params) ->
return false unless @userId
Meteor.keepalive ?= {}
Meteor.clearTimeout Meteor.keepalive[@userId] if Meteor.keepalive[@userId]
Meteor.users.update @userId, $set: {'profile.online': true}
Meteor.keepalive[@userId] = Meteor.setTimeout (=>
delete Meteor.keepalive[@userId]
Meteor.users.update @userId, $set: {'profile.online': false}
), 5000
return true
客户端代码:
Meteor.startup ->
Meteor.setInterval (->
Meteor.call('keepalive') if Meteor.userId()
), 3000
于 2013-01-24T19:16:57.397 回答
0
我对这种情况的建议是danimal:userpresence
因为还有更多好处:
- 通过多个服务器跟踪用户在线状态
- 包含 httpHeaders 所以如果你想检查接收者是否检查了正在发送的消息
- 非常简单的代码阅读
于 2016-12-03T10:26:53.750 回答