使用accounts-ui包时,meteor中是否有post createUser钩子?

jef*_*ink 25 meteor

假设我有一个todo应用程序,我想确保每个注册的用户至少有一个todo开始,类似"第一次交叉!",我将如何在流星中做到这一点?

一般来说,我看到它的方式,我可以在第一次创建用户(理想)时执行此操作,或者每次登录时检查是否需要新的待办事项(不太理想).在后一种情况下,我可以检查Todos.findOne(),如果计数为0,则添加一个.但是,似乎无论我是在页面加载时在路由器中执行此操作,还是在某些模板的.rendered功能上,我正在检查的集合尚未加载,因此我总是创建一个新的待办事项,即使确实存在.如果有人可以解释如何解决这个问题,那就太棒了.

但是,我理想的是能够在创建用户时创建新的Todo.有一种Accounts.onCreateUser方法,但用于向用户配置文件添加其他信息,而不是后创建挂钩.还有一种方法可以使用Accounts.createNewUser回调以编程方式创建用户,但我使用的是accounts-ui包,因此我没有以编程方式添加用户.在一个不太理想的情况下,我可以在用户登录时检查Todo,但即使在这种情况下,似乎还有联合Accounts.loginWithXService登录,因此在任何用户登录时都不知道如何处理回调,而不管服务类型如何.

我想我必须遗漏一些简单的东西,如果这是非常明显的,那么道歉.任何帮助表示赞赏.

Dav*_*aun 18

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;
});
Run Code Online (Sandbox Code Playgroud)

  • 这不适合作为帖子帐户创建挂钩,因为创建可能仍然失败,例如当电子邮件地址已经存在时. (4认同)

小智 10

我使用了上面描述的_.wrap方法但想要包含一个额外的建议.从新的自定义回调中调用原始回调是个好主意.Meteor在回调中做了一些我们不想错过的事情.

修改后的代码对我来说就像一个冠军:

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);
});
Run Code Online (Sandbox Code Playgroud)


Shw*_*ogg 10

如果您使用的是UserAccounts包:postSignUpHook现在存在.

Splendido刚刚将我的拉取请求合并到了这个问题上.

AccountsTemplates.configure({
    /*...*/
    postSignUpHook: /*[callback with your actions post full user creation goes here]*/,
    /*...*/
}
Run Code Online (Sandbox Code Playgroud)

文档(你需要向下滚动它是最后一个钩子):

func(userId,info)仅在服务器端调用,在成功创建用户帐户之后,提交pwdForm进行注册:允许在我们确定成功创建新用户后对正在提交的数据执行自定义操作.常见用途可能是将角色应用于用户,因为这只有在完成用户创建后才能实现:角色.userId可用作第一个参数,因此可以检索用户对象.密码不可用,因为它已经加密,但加密密码可以在info中找到,如果使用的话.