Есть ли в метеоре хук postUser при использовании пакета account-ui?

Допустим, у меня есть приложение todo, и я хочу убедиться, что у каждого зарегистрированного пользователя есть по крайней мере одна задача, с которой нужно что-то вроде «Первая задача, которую нужно вычеркнуть!», Как бы я это сделал в метеоре?

В общем, как я вижу, я могу сделать это, когда пользователь создается впервые (идеально), или проверить, нужно ли ему новое задание при каждом входе в систему (менее идеально). В последнем случае я могу сделать проверку дляTodos.findOne()и, если количество равно 0, добавьте один. Тем не менее, кажется, что я делаю это в моем маршрутизаторе, когда страница загружается, или на некотором шаблоне.rendered Функция, проверяемая коллекция еще не загружена, поэтому я всегда создаю новую задачу, даже если она действительно существует. Так что было бы здорово, если бы кто-то мог объяснить, как обойти это.

Но в идеале я хотел бы просто создать новую Todo при создании пользователя. СуществуетAccounts.onCreateUser метод, но он используется для добавления дополнительной информации в профиль пользователя, а не хука после создания. Есть также метод для программного создания пользователя, используяAccounts.createNewUser с обратным вызовом, но я использую пакет accounts-ui, поэтому не добавляю пользователей программным способом. В менее идеальном случае я мог бы проверять Todo всякий раз, когда пользователь входит в систему, но даже в этом случае, кажется, есть федеративныйAccounts.loginWithXService вход в систему, поэтому не знаете, как обрабатывать обратный вызов, когда любой пользователь входит в систему, независимо от типа службы.

Я думаю, что я упускаю что-то простое, поэтому извиняюсь, если это супер очевидно. Любая помощь приветствуется.

Ответы на вопрос(7)

Решение Вопроса

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

Модифицированный код, который работал как чемпион для меня:

Accounts.createUser = _.wrap(Accounts.createUser, function(createUser) {

    // Store the original arguments
    var args = _.toArray(arguments).slice(1),
        user = args[0];
        origCallback = args[1];

    var newCallback = function(error) {
        // do my stuff

        origCallback.call(this, error);
    };

    createUser(user, newCallback);
});
 portforwardpodcast30 апр. 2014 г., 00:53
Это только сервер, верно?
 Shwaydogg09 сент. 2015 г., 00:17
В других случаях важно помнить, что это НЕ будет работать на стороне сервера. @portforwardpodcast, и др.,createUser может быть использованв любом местетем не менее, в настоящее время обратный вызов является ироничным только для использования на стороне клиента:docs.meteor.com/#/full/accounts_createuser, Таким образом, это не может быть реализовано, когда требуется безопасность. Типичным примером является добавление ролей новым пользователям:stackoverflow.com/questions/30482814/...

Как я могу создать серверную часть пользователей в Meteor?

в резюме:

 Accounts.createUser({
                        username: username,
                        email : email,
                        password : password,
                        profile  : {
                            //publicly visible fields like firstname goes here
                        }

});

проверьте метеорологические документы для большего:http://docs.meteor.com/#/full/accounts_createuser

 Dan Dascalescu16 авг. 2015 г., 21:38
ОП особо упомянул: «Существует также метод для программного создания пользователя с помощью Accounts.createNewUser с обратным вызовом, но я использую пакет accounts-ui, поэтому не добавляю пользователей программным способом».

которые вызываются Meteor, оборачивая их. Я также использую пакеты account-ui и accounts-password и использую метод Underscore _.wrap, чтобы переопределить функцию loginWithPassword. Подчеркивание включено в Meteor по умолчанию.

Я использую что-то вроде этого для входа в систему:

Meteor.loginWithPassword = _.wrap(Meteor.loginWithPassword, function(login) {

  // Store the original arguments
  var args = _.toArray(arguments).slice(1),
      user = args[0],
      pass = args[1],
      origCallback = args[2];

  // Create a new callback function
  // Could also be defined elsewhere outside of this wrapped function
  var newCallback = function() { console.info('logged in'); }

  // Now call the original login function with
  // the original user, pass plus the new callback
  login(user, pass, newCallback);

});

В этом конкретном случае приведенный выше код будет где-то в вашем клиентском коде.

Для Accounts.createUser это может выглядеть примерно так (также где-то в клиентском коде):

Accounts.createUser = _.wrap(Accounts.createUser, function(createUser) {

  // Store the original arguments
  var args = _.toArray(arguments).slice(1),
      user = args[0],
      origCallback = args[1];

  // Create a new callback function
  // Could also be defined elsewhere outside of this wrapped function
  // This is called on the client
  var newCallback = function(err) {
    if (err) {
      console.error(err);
    } else {
      console.info('success');
    }
  };

  // Now call the original create user function with
  // the original user object plus the new callback
  createUser(user, newCallback);

});

Надеюсь, это полезно.

Meteor API теперь имеет хукonCreateUser:

Accounts.onCreateUser(function (options, user) {
  Todos.insert({
    owner: user._id,
    text: "First todo to cross off!",
  });

  // We still want the default hook's 'profile' behavior.
  if (options.profile)
    user.profile = options.profile;

  return user;
});
 Danail Gabenski07 мар. 2014 г., 20:15
Эта функция на самом деле является ловушкой PRE Create User, я думаю, что большинство людей хотят, и на самом деле OP - это то, что вы выполняете что-то после того, как пользователь был создан.
 Dan Dascalescu16 авг. 2015 г., 21:37
@Danail: действительно,_id включен в пользовательский объект. Надеюсь этоPR принят для документов, чтобы упомянуть об этом.
 Danail Gabenski17 авг. 2015 г., 20:18
@DanDascalescu Не уверен, что такое было до недавнего времени, то есть учетная запись пользователя не была создана или _id был недоступен. Придется попробовать его с последней версией, но это хорошая идея, чтобы этот пиар был принят.
 Sander van den Akker24 авг. 2015 г., 17:54
Этоне подходит для создания учетной записи почтовой учетной записи, поскольку создание может все еще быть неудачным, например, когда адрес электронной почты уже существует.
 David Braun08 мар. 2014 г., 18:20
@DanailGabenski Это прекрасно работает для целей ОП. Я обновил свой ответ, чтобы продемонстрировать это.

что он работает, но с недостаточной репутацией, поэтому я голосую и повторяю его здесь - подумал, что важно подтвердить, так как это кажется самым «метеорным» способом :-) обращаясь к ОП.

Спасибо Дэвиду Брауну за публикацию.

Еще один дополнительный комментарий для других новичков: он помещается в блок выполнения сервера или в файл в каталоге / server.

Accounts.onCreateUser(function (options, user) {
  Todos.insert({
    owner: user._id,
    text: "First todo to cross off!",
  });

  // We still want the default hook's 'profile' behavior.
  if (options.profile)
    user.profile = options.profile;

  return user;
});
Если вы используетеУчетные записи пользователей пакет:postSignUpHook сейчас существует.

блемы.

AccountsTemplates.configure({
    /*...*/
    postSignUpHook: /*[callback with your actions post full user creation goes here]*/,
    /*...*/
}

Документация (Вам нужно прокрутить вниз, это последний крюк):

func (userId, info) Вызывается, только на стороне сервера, сразу после успешного создания учетной записи пользователя, после отправки pwdForm для регистрации: позволяет настраивать действия над отправляемыми данными после того, как мы уверены, что новый пользователь был успешно создан. Распространенным применением может быть применение ролей к пользователю, поскольку это возможно только после полного завершения создания пользователя в alanning: role. UserId доступен как первый параметр, так что пользовательский объект может быть получен. Пароль недоступен, так как он уже зашифрован, хотя зашифрованный пароль можно найти в информации, если он используется.

 Denly26 апр. 2017 г., 04:04
Это не работает для регистрации в FB:github.com/meteor-useraccounts/core/issues/669
 KCE27 апр. 2016 г., 16:51
Это путь, особенно если вы хотите что-то сделать с созданным пользователем, например добавить роль в него.

teor:https://groups.google.com/forum/?fromgroups=#!topic/meteor-talk/KSz7O-tt4w8

По сути, в настоящее время нет ловушки createUser при использовании account-ui, только когда это делается программно черезAccounts.createUser, Кроме того, нет никаких хуков для входа в систему, если только не используются такие функции входа, какloginWithFacebookи т. д. Я еще не нашел идеальный способ обойти это, но несколько способов справиться с этим:

если необходимо ввести значение по умолчанию в коллекцию, в подписке этой коллекции используйте аргумент onComplete. В этом обратном вызове, если в коллекции нет записей, добавьте их. Это позволяет избежать первой проблемы, о которой я упоминал в своем посте, о незнании, когда коллекция была загружена, хотя и не идеально, поскольку коллекция может быть пустой, поскольку пользователь уже удалил первую по умолчанию:

Meteor.subscribe 'todos', user: Meteor.userId(), () ->
  todo = Todos.findOne()
  unless todo
    Todos.insert user: Meteor.userId()

Вы можете настроить хук входа в систему, используяMeteor.autorun реактивный метод для проверки изменения в Meteor.userId (). Это будет вызвано только когда пользователь заходит / перезагружает страницу. Это более полезно для вещей, не относящихся к коллекции, так как не гарантируется, что коллекция будет загружена, когда установлен Meteor.userId:

Meteor.autorun () ->
  if Meteor.userId()
    console.log 'Do some post login hook'

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

 Dan Dascalescu16 авг. 2015 г., 21:39
Это устарелоОтвет Дэвида.
 user87178428 окт. 2015 г., 08:49
@DanDascalescu на самом деле это не так, так как ответ Дэвида не предоставляет решение, чтобы подключиться к «пользователь создал и вошел в систему»

Ваш ответ на вопрос