Meteor.onCreateUser钩子里面的异步调用

时间:2014-01-17 02:14:29

标签: asynchronous meteor user-accounts

在我的meteor应用程序中,我正在尝试在服务器上注册用户,做一些工作并向传递给onCreateUser的用户对象添加一些其他属性,然后转到专门适应新版本的“欢迎”页面用户。使用Meteor 7.0.1和Iron-router(最新版)

我的客户端代码如下所示:

// var userId = Meteor.registerUser(registrationOptions);
// Router.go('/welcome/'+userId);

像这样的服务器代码

// Meteor.onCreateUser(options, user){
//   if (options.profile) user.profile = options.profile;
    // a 3rd party method outside of Meteor
//   callToOutsideMethod(Meteor.bindEnvironment(function(e, res){
//      user.results = res;
//      // do other stuff
//      user.foo = blah;
//      user.bar = baz;
//      return user;
//     }, function(err){ console.log(err); });

当我返回用户对象时,我希望meteor创建记录,然后将新用户登录到...

但是会发生的事情是屏幕变得一瞬间扭曲,然后我们跳转到新的网址'/ welcome / the_new_user_id'...

但它会在我尝试访问user_id之外的任何内容的脚本上抛出错误。在Mongo cli上看,没有添加任何新属性,即使是'username'和'login-tokens'等也没有出现在新用户身上。而新创建的用户只有一个_id,没有别的......非常奇怪。

关于可能导致这种奇怪行为的任何想法?

1 个答案:

答案 0 :(得分:2)

在您的代码中,您实际上并没有在onCreateUser内返回任何内容。内部函数返回一些值,然后只是站在那里。


解吗

如果内部函数(callToOutsideMethod)是同步的,它似乎不是,因为它使用了回调 - 但 if 它是,你可以简单地在它面前放一个回复声明:

return callToOutsideMethod(...

如果内部函数是异步的,则需要回溯一下,如果可能的话,在实际创建用户之前获取该函数的返回值。如果无法做到,请参阅下文。


编辑:其他挂钩

请记住,除了the API和内部之外,还存在比onCreateUser更多的钩子。不要害怕查看源文件并使用它们来创建自己的解决方案; Meteor的内部工作原理相对简单:

onCreateUser挂钩的情况下,它在函数Accounts.insertUserDoc内调用,由不同的登录服务 [1] 调用。在您的情况下,您需要能够在异步内容完成后继续insertUserDoc 中的过程。

我唯一能看到,使用当前的API,通过重新定义insertUserDoc函数(可能看起来很危险,但以前已经完成过类似的东西) - 这就是:

// Save the built-in function first
Accounts.insertUserDocFinal = Accounts.insertUserDoc;

Accounts.insertUserDoc = function (options, user) {
  callToOutsideMethod(some_arguments, function (data) {
    // Manipulate options and user objects?

    Accounts.insertUserDocFinal(options, user);
  });
};


带有选项和用户对象的 [1] 然后传递给onCreateUser(除了它们还没有属性_id和{{1} })。