当用户退出网站时,有没有办法接听?当他们这样做时,我需要做一些清理工作。使用内置的meteor.js用户帐户。
我将使用它进行一些验证,因此我需要一个无法代表客户端其他用户触发的解决方案 - 最好是完全服务器端的。
答案 0 :(得分:9)
您可以使用Deps.autorun设置自定义处理程序,观察Meteor.userId()反应变量。
Meteor.userId()(和Meteor.user())是反应变量,分别返回当前登录的userId(如果没有则为null)和Meteor.users集合中相应的用户文档(记录)。
因此,人们可以通过对这些被动数据源的修改做出反应来跟踪Meteor应用程序的登录/退出。
client / main.js:
var lastUser=null;
Meteor.startup(function(){
Deps.autorun(function(){
var userId=Meteor.userId();
if(userId){
console.log(userId+" connected");
// do something with Meteor.user()
}
else if(lastUser){
console.log(lastUser._id+" disconnected");
// can't use Meteor.user() anymore
// do something with lastUser (read-only !)
Meteor.call("userDisconnected",lastUser._id);
}
lastUser=Meteor.user();
});
});
在此代码示例中,我正在设置源文件本地变量(lastUser)以跟踪应用程序中记录的最后一个用户。 然后在Meteor.startup中,我使用Deps.autorun来设置一个反应式上下文(每当访问一个被访问的被动数据源时将重新执行的代码)。 此反应式上下文跟踪Meteor.userId()变体并做出相应的反应。
在解除连接代码中,您不能使用Meteor.user(),但如果要访问最后一个用户文档,则可以使用lastUser变量。 如果要在注销后修改文档,可以使用lastUser._id作为参数调用服务器方法。
服务器/ server.js
Meteor.methods({
userDisconnected:function(userId){
check(userId,String);
var user=Meteor.users.findOne(userId);
// do something with user (read-write)
}
});
请注意,恶意客户端可以与任何userId一起调用此服务器方法,因此除非您设置了一些验证码,否则不应该做任何重要事情。
答案 1 :(得分:7)
使用我创建的user-status
包:https://github.com/mizzao/meteor-user-status。这完全是服务器端的。
请参阅文档以了解用法,但您可以将事件处理程序附加到会话注销:
UserStatus.events.on "connectionLogout", (fields) ->
console.log(fields.userId + " with connection " + fields.connectionId + " logged out")
请注意,用户可以使用多个会话一次从不同位置登录。这个智能包可以检测所有这些以及用户是否在线。有关更多信息或实现自己的方法,请查看代码。
目前,该软件包不区分浏览器窗口关闭和注销,并将它们视为相同。
答案 2 :(得分:6)
我们有类似的,但不是确切的要求。我们想在客户退出时对客户进行一些清理。我们是通过劫持Meteor.logout
:
if (Meteor.isClient) {
var _logout = Meteor.logout;
Meteor.logout = function customLogout() {
// Do your thing here
_logout.apply(Meteor, arguments);
}
}
答案 3 :(得分:2)
@saimeunt提供的答案看起来很正确,但对于我需要的东西来说有点蓬松。相反,我采用了一种非常简单的方法:
if (Meteor.isClient) {
Deps.autorun(function () {
if(!Meteor.userId())
{
Session.set('store', null);
}
});
}
但是,如果用户尚未登录,则会在页面加载期间触发,这可能是不合需要的。所以你可以选择这样的东西:
if (Meteor.isClient) {
var userWasLoggedIn = false;
Deps.autorun(function (c) {
if(!Meteor.userId())
{
if(userWasLoggedIn)
{
console.log('Clean up');
Session.set('store', null);
}
}
else
{
userWasLoggedIn = true;
}
});
}
答案 4 :(得分:1)
这些解决方案都不适合我,因为他们都遇到了无法区分用户手动注销与浏览器页面重新加载/关闭的问题。
我现在正在进行攻击,但至少它可行(只要你没有提供任何其他登出方式,而不是默认的帐户-ui按钮):
Template._loginButtons.events({
'click #login-buttons-logout': function(ev) {
console.log("manual log out");
// do stuff
}
});
答案 5 :(得分:-2)
您可以使用以下Meteor.logout - http://docs.meteor.com/#meteor_logout