Picking up meteor.js user logout

前端 未结 6 2045
陌清茗
陌清茗 2020-12-30 01:52

Is there any way to pick up when a user logs out of the website? I need to do some clean up when they do so. Using the built-in meteor.js user accounts.

I\'ll be doi

6条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-30 02:13

    You may use Deps.autorun to setup a custom handler observing Meteor.userId() reactive variable changes.

    Meteor.userId() (and Meteor.user()) are reactive variables returning respectively the currently logged in userId (null if none) and the corresponding user document (record) in the Meteor.users collection.

    As a consequence one can track signing in/out of a Meteor application by reacting to the modification of those reactive data sources.

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

    In this code sample, I'm setting up a source file local variable (lastUser) to keep track of the last user that was logged in the application. Then in Meteor.startup, I use Deps.autorun to setup a reactive context (code that will get re-executed whenever one of the reactive data sources accessed is modified). This reactive context tracks Meteor.userId() variation and reacts accordingly.

    In the deconnection code, you can't use Meteor.user() but if you want to access the last user document you can use the lastUser variable. You can call a server method with the lastUser._id as argument if you want to modify the document after logging out.

    server/server.js

    Meteor.methods({
        userDisconnected:function(userId){
            check(userId,String);
            var user=Meteor.users.findOne(userId);
            // do something with user (read-write)
        }
    });
    

    Be aware though that malicious clients can call this server method with anyone userId, so you shouldn't do anything critical unless you setup some verification code.

提交回复
热议问题