拿起meteor.js用户注销

时间:2013-07-29 11:51:51

标签: javascript meteor

当用户退出网站时,有没有办法接听?当他们这样做时,我需要做一些清理工作。使用内置的meteor.js用户帐户。

我将使用它进行一些验证,因此我需要一个无法代表客户端其他用户触发的解决方案 - 最好是完全服务器端的。

6 个答案:

答案 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