12

有没有办法获取所有当前连接的用户的列表?我检查了许多聊天室教程,但没有一个提供这种方法。是否有可能,如果可以,如何以 Meteor 的方式正确实施它?

4

6 回答 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 回答