Подтвердить что ты не робот

Есть ли созданный крюк createUser в метеор при использовании пакета -si-ui?

Скажем, у меня есть приложение todo, и я хочу убедиться, что каждый пользователь, который регистрируется, имеет по крайней мере одно todo для начала, что-то вроде "First todo to off off!", как бы я сделал это в метеор?

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

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

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

4b9b3361

Ответ 1

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

Измененный код, который работал как чемпион для меня:

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

Ответ 2

В 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 'profile' behavior.
  if (options.profile)
    user.profile = options.profile;

  return user;
});

Ответ 3

Если вы используете пакет UserAccounts: postSignUpHook теперь существует.

Splendido просто объединил мой запрос на тягу именно для этой проблемы.

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

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

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

Ответ 4

Вы можете комбинировать функции, которые вызывается Meteor, обертывая их. Я также использую пакеты учетных записей 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);

});

Надеюсь, что это поможет.

Ответ 5

Один из разработчиков Meteor ответил на этот вопрос в группе Meteor google: https://groups.google.com/forum/?fromgroups=#!topic/meteor-talk/KSz7O-tt4w8

В принципе, прямо сейчас, при использовании учетных записей ui нет крюка createUser, только при программном использовании этого с помощью 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'
    

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

Ответ 6

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

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

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

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

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

  return user;
});