11

我的最终目标是让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()),也没有在通过模板访问时定义。

这是一个错误吗?难道我做错了什么?

4

4 回答 4

23

看到这个答案:

 


默认情况下,服务器会发布用户名、电子邮件和个人资料

因此,您需要发布/订阅附加字段。

服务器:

Meteor.publish('userData', function() {
  if(!this.userId) return null;
  return Meteor.users.find(this.userId, {fields: {
    permission: 1,
  }});
});

客户:

Deps.autorun(function(){
  Meteor.subscribe('userData');
});

 


 

查看您的代码,缺少的部分是在订阅时自动运行的。没有它,订阅会在应用加载时调用一次,并且在用户更改时不会更改 - 例如,当他第一次设置时。

于 2013-10-15T22:18:54.703 回答
8

文档

默认情况下,当前用户的用户名、电子邮件和个人资料会发布到客户端。

因此,为了发布您的领域,您需要执行以下操作:

Meteor.publish('userdata', function() {
  return Meteor.users.find({}, {fields: {'CUSTOM_FIELD_I_FREAKEN_WANT_TO_PUBLISH':1}});
});
于 2013-10-15T21:29:41.847 回答
3

你非常亲近。你有两个问题:

1) publish 中的 ready() 调用是不必要的,因为如果您返回游标,它会自动发送。当您确实需要它时,您希望在发送完所有数据后在发布结束时调用它。

2)您想返回一个用find()而不是完成的游标findOne()

所以你的发布将是:

//on server
Meteor.publish( 'userData', function(){
  return Meteor.users.find({_id: this.userId});
});

您显示的代码实际上并未测试是否已收到任何数据,因此要确保这不是问题,请尝试:

//on client
var s = Meteor.subscribe('userdata', function() { 
  console.log('userdata available');
  console.log('s.ready: '+s.ready());
  console.log('userData: ' + JSON.stringify( Meteor.users.findOne()) );
});

console.log('s.ready: '+s.ready())

此外,正如 David Weldon 在他的回答中所说,您可能希望通过在您发布的 find() 中设置字段选项来准确指定和限制发送给客户端的字段。

于 2014-01-17T23:59:17.073 回答
0

我认为,您可能试图Accounts.onCreateUser()从文档http://docs.meteor.com/#accounts_oncreateuser中查找功能。在配置文件、电子邮件、_id 等旁边,有一个如何将任何对象添加到用户文档中的确切示例。

于 2014-01-17T22:19:18.983 回答