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;
});
答案 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对象,但现在我很满意。