我在Meteor中编写了一个数据敏感的应用程序,并试图限制客户端访问尽可能多的信息.因此,我想实现服务器端计数登录和匿名用户的数量.
我尝试了各种各样的方法.第一个是在这个问题Server cleanup after a client disconnects中概述的,其中提到:
this.session.socket.on("close")
然而,当我做了,并试图改变一个集合,它抛出一个“流星的代码必须始终运行在光纤”错误.我假设这个问题是因为一旦套接字关闭,该光纤被杀死,因此访问数据库是不可能的. OP指出这个“Meteor code must always run within a Fiber” when calling Collection.insert on server是一个可能的解决方案,但我不知道这是否是最好的方法,根据答案的意见.
然后我尝试对变量进行自动运行:
Meteor.default_server.stream_server.all_sockets().length
但是自动运行从来没有似乎被调用,所以我假设变量不是一个反应的上下文,我不知道如何使它成为一个.
最后一个想法是做一个keepalive风格的事情,但这似乎完全违背了流星哲学的粮食,我认为我只会用作一个绝对的最后手段.
我做了一个console.log的这个函数on.session.socket,唯一的其他功能可能是.on(“data”),但这是不是在socket关闭时调用.
我在这里有一点损失,所以任何帮助将是伟大的,
谢谢.
解决方法
为了完整起见,最好结合上面的两个答案.换句话说,请执行以下操作:
>保持在Meteor.users的在线状态,而不是单独收集,如https://github.com/erundook/meteor-profile-online
通过回调跟踪断开连接,而不是像https://github.com/murilopolese/howmanypeoplearelooking那样的心跳
这可能是在流星中实现这一点的规范方法.我已经将它创建为一个可以使用陨石安装的智能包:https://github.com/mizzao/meteor-user-status