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



Meteors loginwithpassword()函数无法为我提供对象SystemData,我将其添加到注册过程中的用户DOC(不介绍OBJ)。事实是,如果我在登录后查看控制台,i can 请参阅该对象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;
});

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

我在回调函数中使用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

i创建用户流动代码:(选项包含SystemData)

Accounts.createUser option

第一个问题是您要在向客户端发布的用户文档上进行自定义字段。这是一个常见的问题 - 请参阅此处的答案。

下一个问题是,即使在添加类似:

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

我认为您仍然有比赛状况。当您调用loginWithPassword时,服务器将发布您的用户文档,但它还将使用systemData字段发布另一个版本的同一文档。您希望这两个事件都在调用Meteor.user()时已经完成。在实践中,这可能只是有效的,但是我不确定是否可以保证它总是会的。正如您建议的那样,如果您添加了可能有效的计时器稍微延迟,但这是一个丑陋的黑客。

另外,您可以在用户的profile中添加systemData,以便始终发布?

我找不到解决方法的确切方法,但很容易解决。要在用户登录后立即采取一些操作(例如,将用户动态重定向到适当的页面),您可以使用Iron Router在主页上挂钩。(如果使用它。):

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')以获取用户达塔对象,但是现在我很满意。

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

最新更新