有没有办法获取所有当前连接的用户的列表?我检查了许多聊天室教程,但没有一个提供这种方法。它是否可能,如果是这样的话,如何正确地实现Meteor方式?
答案 0 :(得分:17)
我已经设法找到一种方法来做到这一点,而不使用低效的保持活动。基本上,用户登录或重新连接会将profile.online
设置为true,并且注销或断开连接会将其设置为false。您可以将其添加为Meteorite智能包并在此处进行试用:
https://github.com/mizzao/meteor-user-status
感谢修复或改进。
答案 1 :(得分: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);
答案 2 :(得分:1)
老问题,但对于任何关注此问题的人来说,现在都有一个监控客户端到服务器连接的流星包。它被称为流星用户状态,可以找到on github.
答案 3 :(得分: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
答案 4 :(得分: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
答案 5 :(得分:0)
我对此案例的建议是danimal:userpresence
,因为还有一些好处: