Meteor.users上的自定义字段未发布

时间:2013-10-15 21:20:15

标签: javascript meteor

我的最终目标是,如果他们已登录,则可通过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()),也不会在通过模板访问时定义。

这是一个错误吗?我做错了吗?

3 个答案:

答案 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等