繁体   English   中英

拿起meteor.js用户注销

[英]Picking up meteor.js user logout

当用户退出网站时,有什么方法可以提取吗? 当他们这样做时,我需要做一些清理工作。 使用内置的meteor.js用户帐户。

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

您可以使用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()变体并作出相应的反应。

在deconnection代码中,您不能使用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一起调用此服务器方法,因此除非您设置了一些验证码,否则不应该做任何重要的事情。

使用我创建的user-status包: https//github.com/mizzao/meteor-user-status 这完全是服务器端的。

请参阅文档以了解用法,但您可以将事件处理程序附加到会话注销:

UserStatus.events.on "connectionLogout", (fields) ->
  console.log(fields.userId + " with connection " + fields.connectionId + " logged out")

请注意,用户可以使用多个会话一次从不同位置登录。 这个智能包可以检测所有这些以及用户是否在线。 有关更多信息或实现自己的方法,请查看代码。

目前,该软件包不区分浏览器窗口关闭和注销,并将它们视为相同。

我们有类似的,但不是确切的要求。 我们想在客户退出时对客户进行一些清理。 我们通过劫持Meteor.logout做到这Meteor.logout

if (Meteor.isClient) {
  var _logout = Meteor.logout;
  Meteor.logout = function customLogout() {
    // Do your thing here
    _logout.apply(Meteor, arguments);
  }
}

@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;
        }
    });
}

这些解决方案都不适合我,因为他们都遇到了无法区分用户手动注销与浏览器页面重新加载/关闭的问题。

我现在正在进行黑客攻击,但至少它可行(只要你没有提供任何其他登出方式,而不是默认的帐户-ui按钮):

Template._loginButtons.events({
    'click #login-buttons-logout': function(ev) {
        console.log("manual log out");
        // do stuff
    }
});

您可以使用以下Meteor.logout - http://docs.meteor.com/#meteor_logout

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM