Asynchronous Meteor.onCreateUser钩子内的异步调用
在我的meteor应用程序中,我试图在服务器上注册一个用户,做一些工作,并向传递到onCreateUser的用户对象添加一些附加属性,然后转到一个特别适合新用户的“欢迎”页面。使用Meteor 7.0.1和Iron router(最新版本) 我的客户端代码如下所示: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
// 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内部的异步调用”。您还应该添加一些标记,尝试使用帐户
/用户
和异步
/异步
。