在我的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,没有别的......非常奇怪。
关于可能导致这种奇怪行为的任何想法?
答案 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} })。