25

假设我有一个待办事项应用程序,我想确保每个注册的用户至少有一个待办事项开始,例如“第一个要划掉的待办事项!”,我将如何在流星中做到这一点?

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

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

我想我一定遗漏了一些简单的东西,如果这非常明显,请道歉。任何帮助表示赞赏。

4

6 回答 6

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;
});
于 2014-03-04T20:03:13.210 回答
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);
});
于 2012-11-20T22:18:06.103 回答
10

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

Splendido 刚刚合并了我针对这个问题的拉取请求。

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

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

func(userId, info) Called, server side only, just after a successfull user account creation, post submitting the pwdForm for sign-up: allows for custom actions on the data being submitted after we are sure a new user was successfully created. A common use might be applying roles to the user, as this is only possible after fully completing user creation in alanning:roles. The userId is available as the first parameter, so that user object may be retrieved. The password is not available as it's already encrypted, though the encrypted password may be found in info if of use.

于 2015-12-06T04:21:17.280 回答
4

您可以通过包装它们来搭载 Meteor 调用的函数。我还使用了accounts-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);

});

希望这会有所帮助。

于 2012-11-07T19:37:20.703 回答
2

Meteor 开发人员之一在 Meteor google 小组中回答了这个问题:https ://groups.google.com/forum/?fromgroups=#!topic/meteor-talk/KSz7O-tt4w8

基本上,现在,在使用 accounts-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'
    

所以我认为有效的解决方案仍然存在,但想用我在此期间找到的解决方法来更新这篇文章。

于 2012-10-25T02:39:20.570 回答
-3

我认为这更好地回答了这个问题:如何在 Meteor 中创建用户服务器端?

在简历中:

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

});

查看流星文档了解更多信息: http: //docs.meteor.com/#/full/accounts_createuser

于 2015-02-02T16:27:14.280 回答