【问题标题】:Asynchronous call inside Meteor.onCreateUser hookMeteor.onCreateUser 钩子内的异步调用
【发布时间】:2014-01-17 02:14:29
【问题描述】:

在我的流星应用程序中,我试图在服务器上注册一个用户,做一些工作并为传递给 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); });

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

但是发生的情况是屏幕在一秒钟内全部变形,然后我们跳转到新的 url '/welcome/the_new_user_id'...

但它会在我试图访问除 user_id 之外的任何内容的脚本上引发错误。查看 Mongo cli,没有添加任何新属性,甚至 'username' 和 'login-tokens' 等都不会出现在新用户上。而新创建的用户只有一个 _id,没有别的……很奇怪。

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

【问题讨论】:

  • 请让您的问题的标题更具体,以便其他人找到它,例如“Meteor.onCreateUser 中的异步调用”。您还应该添加更多标签,尝试使用accounts/usersasync/asynchronous

标签: asynchronous meteor user-accounts


【解决方案1】:

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


解决方案?

If 内部函数 (callToOutsideMethod) 是同步的,但它似乎不是,因为它使用回调 - 但 if 它是,你可以简单地在它前面放一个return语句:

return callToOutsideMethod(...

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


编辑:其他钩子

请记住,存在比onCreateUser 更多的钩子,无论是作为the API 的一部分还是在内部。不要害怕查看源文件并使用它们来创建自己的解决方案; 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 和 @987654333 @)。

【讨论】:

  • 感谢您的回复 - 问题是这样的:我需要来自用于创建用户的对象的数据才能运行 callToOutsideMethod... 然后我希望 Meteor 等到我得到回复从方法,然后使用户。所以你说如果 callToOutsideMethod 是异步的,这是不可能的?
  • 如果你重新定义insertUserdoc,确保它是健壮的——也就是说,确保insertUserDocFinal最终被调用。
猜你喜欢
  • 1970-01-01
  • 2013-07-17
  • 2019-11-15
  • 2020-09-27
  • 1970-01-01
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多