我正在编写一个需要显示一些用户信息的应用程序。 因为Meteor.user()不是立即可用的,所以我使用处理程序栏帮助程序
包装了每个用户信息Handlebars.registerHelper('isLoggingIn', function() {
return Meteor.loggingIn();
})
这对我有用,直到我需要为每个用户/用户角色创建管理页面和自定义内容。 在等待加载角色时,等待Meteor.user()可用或首先显示一般信息是我想避免的选项。
然后我尝试了另一种方法,并使用新的Collection发布了currentUser。
Meteor.publish('currentUser', function() {
var sub = this;
var handle = Meteor.users.find({_id: this.userId}).observe({
added: function (user) {
sub.added('currentUser', user._id, user);
}
});
sub.ready();
sub.onStop(function() { handle.stop(); });
});
和
CurrentUser = new Meteor.Collection('currentUser');
通过这种方式,我可以使用CurrentUser.findOne()访问登录用户,并且它可以与其他集合同时使用。
我担心的是,这种替代方案并不像普通的Meteor.user()那样安全无问题,而且我想知道我的方法是否正确以及是否有更好的方法来获得相同的结果(用户详细信息)立即可用)而不重新发明轮子。
答案 0 :(得分:2)
只需注意,您可以使用{{loggingIn}}
,{{#if loggingIn}}..
而无需编写自己的帮助。
发布使用自定义发布功能登录的用户的选项会增加不必要的复杂性。
当涉及到安全性时,你必须假设它来自客户端,在任何情况下它都是不值得信任的。这意味着只有在登录到该用户时才会发布角色的相关数据等。
在服务器上,一旦用户登录,数据立即可用,您所要做的就是仅发布该用户角色的数据。在客户端上,可能需要一些时间来调整,这就是为什么你可以使用占位符,直到订阅完成。
可能更好的选择是使用帮助程序检查订阅何时完成并显示“加载消息”。或者使用诸如iron-router
(github.com/EventedMind/iron-router)之类的路由器,它可以让您等待特定页面的订阅完成。
这样您就可以按照预期的方式使用Meteor.user()
,{{#currentUser}}
和角色。
要记住的一件事是,如果您想检查用户是否已登录,而不是使用:
if(Meteor.user())
但是
if(Meteor.user() && Meteor.user().profile && Meteor.user().profile.name)
(您必须在个人资料中插入name
属性)。登录用户时会获得越来越多的数据。我注意到如果你等待配置文件字段,那么用户就已经准备好了。最初似乎profile
字段为空(仍然是登录),但如果您使用if(Meteor.user())