Вызов пользователя meteor.js

Есть ли способ подобрать, когда пользователь выходит из веб-сайта? Мне нужно немного очистить, когда они это сделают. Использование встроенных учетных записей пользователей meteor.js.

Я буду использовать его для проверки, поэтому мне нужно решение, которое не может запускаться от имени других пользователей на стороне клиента - желательно что-то полностью серверное.

Ответы

Ответ 1

Используйте созданный мной пакет 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

Вы можете использовать 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)
    }
});

Имейте в виду, что вредоносные клиенты могут вызвать этот серверный метод с любым пользователем, поэтому вы не должны делать ничего критического, если вы не настроите какой-либо проверочный код.

Ответ 3

У нас было подобное, хотя и не точное требование. Мы захотели сделать немного очистки на клиенте, когда они вышли из системы. Мы сделали это путем угона Meteor.logout:

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

Ответ 4

Ответ, предоставленный @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;
        }
    });
}

Ответ 5

Ни одно из решений не работало для меня, так как все они страдали от проблемы неспособности различать ручной отход от перезагрузки/закрытия страницы пользователя или браузера.

Теперь я собираюсь с хаком, но, по крайней мере, он работает (пока вы не предоставляете никаких других способов выхода из системы, кроме стандартных учетных записей - ui):

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