Вызов пользователя 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
}
});
Ответ 6
Вы можете использовать следующий Meteor.logout - http://docs.meteor.com/#meteor_logout