我的最终目标是,如果他们已登录,则可通过CUSTOM_FIELD_I_FREAKEN_WANT_TO_PUBLISH
向模板提供{{currentUser}}
,但Meteor不会向用户集合发送所有字段。
在服务器中:
Meteor.publish('userdata', function() {
this.ready(); // do I really even need to do this?
//return Meteor.users.find(); //This STILL doesn't work
return Meteor.users.findOne({_id: this.userId});
});
在客户端:
var s = Meteor.subscribe('userdata', function() {
console.log('userdata available');
console.log('s.ready: '+s.ready())
});
console.log('s.ready: '+s.ready())
我可以直接连接到mongo实例并输入:db.users.find()
来验证集合中是否有字段:
{
"_id" : "N2M7Zp265vkbTBTFF",
"createdAt" : ISODate("2013-10-15T03:29:53.155Z"),
"CUSTOM_FIELD_I_FREAKEN_WANT_TO_PUBLISH" : "P4GRrQMixEZducmuo",
"profile" : {
"name" : "Jonathan Dumaine",
...,
},
"services" : {
"facebook" : {
....,
}
}
}
在验证客户端中的订阅准备就绪后,用户集合上的唯一字段为_id
和_profile
。其他字段在客户端中不可见(通过控制台Meteor.users.find().fetch()
),也不会在通过模板访问时定义。
这是一个错误吗?我做错了吗?
答案 0 :(得分:23)
请参阅this answer:
默认情况下,服务器会发布用户名,电子邮件和个人资料
因此您需要发布/订阅其他字段。
服务器:
Meteor.publish('userData', function() {
if(!this.userId) return null;
return Meteor.users.find(this.userId, {fields: {
permission: 1,
}});
});
客户端:
Deps.autorun(function(){
Meteor.subscribe('userData');
});
查看您的代码,缺少的部分是在订阅时自动运行。没有它,订阅会在应用程序加载时调用一次,并且在用户更改时不会更改 - 例如,当他第一次设置时。
答案 1 :(得分:8)
来自docs:
默认情况下,当前用户的用户名,电子邮件和个人资料将发布到客户端。
因此,为了发布您的字段,您需要执行以下操作:
Meteor.publish('userdata', function() {
return Meteor.users.find({}, {fields: {'CUSTOM_FIELD_I_FREAKEN_WANT_TO_PUBLISH':1}});
});
答案 2 :(得分:0)
我想,您可能正在尝试从文档http://docs.meteor.com/#accounts_oncreateuser中找到函数Accounts.onCreateUser()
。有一个确切的例子,如何将任何对象添加到用户文档,旁边的个人资料,电子邮件,_id等