Meteor.loginWithPassword回调不在用户帐户doc中提供自定义对象

时间:2014-01-24 01:03:40

标签: login meteor

Meteors loginWithPassword()函数没有为我提供对象systemData,我在注册时将其添加到用户doc(不是为了配置文件obj)。问题是,如果我在登录后查看控制台,我可以看到该对象systemData(这可能意味着它不是发布问题),而不是在loginWithPassword()函数的回调中,我需要他们(动态地将用户重定向到正确的页面)。有没有办法得到这个对象,没有像计时器这样丑陋的东西?

Meteor.loginWithPassword(email, password, function(errorObject) {
if (errorObject) {
 ...
} else {

// returns true
if (Meteor.userId()) {
    // returns false
    if (Meteor.user().systemData) {
    ...
    }
    // user doc without systemData object
    console.log(JSON.stringify(Meteor.user());
}

}

我在创建用户时添加了对象systemData:

Accounts.onCreateUser(function(options, user) {

if (options.profile) {
user.profile = options.profile;
}
...
user.systemData = systemDataRegularUser;
return user;
});

3 个答案:

答案 0 :(得分:0)

您确定将数据发布到客户端吗?

我在回调函数中使用loginWithPassword获取用户信息。

Meteor.loginWithPassword username,password,(error,result1)->
                  options =             
                      username: username
                      password: password
                      email: result['data']['email']
                      profile:          
                          name: result['data']['display-name']
                          roles: result.roles
                  console.log Meteor.user(), result1

我创建用户流动代码:(选项包含systemData)

Accounts.createUser option

答案 1 :(得分:0)

第一个问题是您希望在发布到客户端的用户文档上使用自定义字段。这是一个常见问题 - 请参阅答案here

接下来的问题是即使你添加了类似的内容:

Meteor.publish("userData", function () {
  return Meteor.users.find(this.userId, {fields: {systemData: 1}});
});

我认为你还有竞争条件。当您致电loginWithPassword时,服务器将发布您的用户文档,但它也会发布带有systemData字段的同一文档的另一个版本。您希望在调用Meteor.user()之前两个事件都已完成。在实践中,这可能只是起作用,但我不确定它是否会保证。正如你的建议,如果你添加了一个可能有效的计时器,但这是一个丑陋的黑客。

或者,您可以将systemData添加到用户的profile,以便始终发布吗?

答案 2 :(得分:0)

我没有找到解决方法的确切方法,但找到了简单的解决方法。 要在用户登录后立即采取一些措施(例如,动态地将用户重定向到正确的页面),您可以使用Iron路由器挂接主页。(如果您使用它。):

this.route('UsersListingHome', {
  path: '/',
  template: 'UsersListing',
  data: function() { ... },
  before: function() {    
    if (isCurrentUserAdmin() && Session.get('adminJustLogged') !== 'loggedIn') {
      Router.go('/page-to-redirect');
      Session.set('adminJustLogged','loggedIn');    
    }
  }
});

点击课程if (isCurrentUserAdmin()) { Session.set('adminJustLogged', null); }

后点击

我进一步想过调用Meteor.call('someMethod')来获取Method回调中的userData对象,但现在我很满意。

PS:我知道不建议有足够的会话变量或其他反应数据来加速我的应用程序,但我相信,那不是悲剧:) PS2:无论如何,谢谢你的答案。