Asynchronous Meteor.onCreateUser钩子内的异步调用

Asynchronous Meteor.onCreateUser钩子内的异步调用,asynchronous,meteor,user-accounts,Asynchronous,Meteor,User Accounts,在我的meteor应用程序中,我试图在服务器上注册一个用户,做一些工作,并向传递到onCreateUser的用户对象添加一些附加属性,然后转到一个特别适合新用户的“欢迎”页面。使用Meteor 7.0.1和Iron router(最新版本) 我的客户端代码如下所示: // var userId = Meteor.registerUser(registrationOptions); // Router.go('/welcome/'+userId); 像这样的服务器代码 // Meteor.onC

在我的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创建记录,然后将新用户登录到

但是发生的情况是,屏幕在一秒钟内完全扭曲,然后我们跳转到新的url“/welcome/the_new_user_id”

但是它在脚本上抛出了一个错误,我试图访问除用户id之外的任何内容。在Mongo cli上,没有添加任何新属性,甚至“用户名”和“登录令牌”等都不会出现在新用户上。而新创建的用户只有一个_id,其他什么都没有。。。很奇怪


你知道是什么导致了这种奇怪的行为吗?

在你的代码中,你实际上并没有在onCreateUser中返回任何东西。内部函数返回某个值,然后该值仅停留在那里


解决方案?

如果内部函数(
callToOutsideMethod
)是同步的,但它似乎不是同步的,因为它使用回调–但是如果是,您只需在它前面放一个return语句:

返回callToOutsideMethod(…

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


编辑:其他挂钩

记住,无论是作为一部分还是作为内部,存在的钩子都比创建用户的钩子多得多。不要害怕查看源文件并使用它们创建自己的解决方案;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
的选项和用户对象(除非它们还没有属性
\u id
createdAt
).

感谢您的回复-问题在于:我需要用于创建用户的对象的数据来运行CallToOutside方法…然后我希望Meteor等待,直到我从该方法获得回复,然后生成用户。所以您是说如果CallToOutside方法是异步的,这是不可能的?如果您重新定义
insertUserdoc
,确保它是健壮的–也就是说,确保最终调用
insertUserDocFinal
。请将问题的标题更具体,以便其他人找到它,例如“Meteor.onCreateUser内部的异步调用”。您还应该添加一些标记,尝试使用
帐户
/
用户
异步
/
异步