Есть ли созданный крюк 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
, поэтому не уверен, как обрабатывать обратный вызов, когда какой-либо пользователь входит в систему, независимо от того, типа обслуживания.
Думаю, я должен пропустить что-то простое, поэтому извиняюсь, если это супер очевидно. Любая помощь приветствуется.
Ответы
Ответ 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;
});
Ответ 7
Я думаю, что этот ответ лучше ответить на этот вопрос: Как создать серверную часть пользователей в Meteor?
в резюме:
Accounts.createUser({
username: username,
email : email,
password : password,
profile : {
//publicly visible fields like firstname goes here
}
});
проверьте документы метеоров для более: http://docs.meteor.com/#/full/accounts_createuser